@restatedev/restate-cdk 0.4.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/lambda-service-registry.d.ts +11 -18
- package/dist/lambda-service-registry.js +19 -15
- package/dist/register-service-handler/index.d.ts +1 -2
- package/dist/register-service-handler/index.js +24 -16
- package/dist/registration-provider.js +2 -2
- package/dist/restate-cloud-environment.d.ts +27 -0
- package/dist/restate-cloud-environment.js +71 -0
- package/dist/{restate-instance.d.ts → restate-environment.d.ts} +4 -4
- package/dist/restate-environment.js +3 -0
- package/dist/{single-node-restate-instance.d.ts → single-node-restate-deployment.d.ts} +6 -4
- package/dist/single-node-restate-deployment.js +165 -0
- package/package.json +10 -10
- package/dist/restate-cloud-endpoint.d.ts +0 -27
- package/dist/restate-cloud-endpoint.js +0 -70
- package/dist/restate-instance.js +0 -3
- package/dist/single-node-restate-instance.js +0 -163
package/README.md
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
[](https://docs.restate.dev)
|
|
2
|
-
[](https://github.com/restatedev/examples)
|
|
3
|
+
[](https://discord.gg/skW3AZ6uGd)
|
|
3
4
|
[](https://twitter.com/intent/follow?screen_name=restatedev)
|
|
4
5
|
|
|
5
6
|
# Restate CDK support
|
|
6
7
|
|
|
7
|
-
CDK construct library for deploying [Restate](https://restate.dev) and Restate services on
|
|
8
|
+
AWS Cloud Development Kit (CDK) construct library for deploying [Restate](https://restate.dev) and Restate services on
|
|
9
|
+
AWS. This library helps you when deploying Restate services to AWS Lambda as well as for managing self-hosted Restate
|
|
10
|
+
deployments on your own infrastructure. For more information on CDK, please
|
|
11
|
+
see [Getting started with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html).
|
|
12
|
+
|
|
13
|
+
## Available constructs
|
|
14
|
+
|
|
15
|
+
- [`LambdaServiceRegistry`](./lib/restate-constructs/lambda-service-registry.ts) - A collection of Lambda-deployed
|
|
16
|
+
Restate services, this construct automatically registers the latest function version as a new deployment revision in a
|
|
17
|
+
Restate instance
|
|
18
|
+
- [`SingleNodeRestateDeployment`](./lib/restate-constructs/single-node-restate-deployment.ts) - Deploys a self-hosted
|
|
19
|
+
Restate instance on EC2; note this is a single-node deployment targeted at development and testing
|
|
20
|
+
- [`RestateCloudEnvironment`](./lib/restate-constructs/restate-cloud-environment.ts) - A Restate Cloud instance
|
|
21
|
+
|
|
22
|
+
For a more detailed overview, please see
|
|
23
|
+
the [Restate CDK documentation](https://docs.restate.dev/services/deployment/cdk).
|
|
24
|
+
|
|
25
|
+
### Examples
|
|
26
|
+
|
|
27
|
+
You can use the following examples as references for your own CDK projects:
|
|
28
|
+
|
|
29
|
+
- [hello-world-lambda-cdk](https://github.com/restatedev/examples/tree/main/kotlin/hello-world-lambda-cdk) - Kotlin
|
|
30
|
+
service deployed to AWS Lambda
|
|
31
|
+
- [Restate Holiday](https://github.com/restatedev/restate-holiday) - a more complex example of a fictional reservation
|
|
32
|
+
service demonstrating the Saga orchestration pattern
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from "./lambda-service-registry";
|
|
2
2
|
export * from "./registration-provider";
|
|
3
|
-
export * from "./restate-cloud-
|
|
4
|
-
export * from "./restate-
|
|
5
|
-
export * from "./single-node-restate-
|
|
3
|
+
export * from "./restate-cloud-environment";
|
|
4
|
+
export * from "./restate-environment";
|
|
5
|
+
export * from "./single-node-restate-deployment";
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
__exportStar(require("./lambda-service-registry"), exports);
|
|
28
28
|
__exportStar(require("./registration-provider"), exports);
|
|
29
|
-
__exportStar(require("./restate-cloud-
|
|
30
|
-
__exportStar(require("./restate-
|
|
31
|
-
__exportStar(require("./single-node-restate-
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
__exportStar(require("./restate-cloud-environment"), exports);
|
|
30
|
+
__exportStar(require("./restate-environment"), exports);
|
|
31
|
+
__exportStar(require("./single-node-restate-deployment"), exports);
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw0REFBMEM7QUFDMUMsMERBQXdDO0FBQ3hDLDhEQUE0QztBQUM1Qyx3REFBc0M7QUFDdEMsbUVBQWlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyYXRpb24tcHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtY2xvdWQtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpbmdsZS1ub2RlLXJlc3RhdGUtZGVwbG95bWVudFwiOyJdfQ==
|
|
@@ -1,38 +1,31 @@
|
|
|
1
1
|
import * as lambda from "aws-cdk-lib/aws-lambda";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
|
-
import {
|
|
3
|
+
import { RestateEnvironment } from "./restate-environment";
|
|
4
4
|
/**
|
|
5
5
|
* A Restate RPC service path. Example: `greeter`.
|
|
6
6
|
*/
|
|
7
|
-
type RestatePath = string;
|
|
8
|
-
export interface RestateInstanceRef {
|
|
9
|
-
readonly metaEndpoint: string;
|
|
10
|
-
readonly invokerRoleArn: string;
|
|
11
|
-
readonly authTokenSecretArn?: string;
|
|
12
|
-
}
|
|
7
|
+
export type RestatePath = string;
|
|
13
8
|
/**
|
|
14
|
-
*
|
|
9
|
+
* Manage registration of a set of Lambda-deployed Restate RPC Service handlers with a Restate environment.
|
|
15
10
|
*/
|
|
16
11
|
export type LambdaServiceRegistryProps = {
|
|
17
12
|
/**
|
|
18
|
-
*
|
|
13
|
+
* Custom resource provider token required for service discovery.
|
|
19
14
|
*/
|
|
20
|
-
|
|
15
|
+
environment: RestateEnvironment;
|
|
21
16
|
/**
|
|
22
|
-
*
|
|
17
|
+
* Lambda Restate service handlers to deploy.
|
|
23
18
|
*/
|
|
24
|
-
|
|
19
|
+
handlers: Record<RestatePath, lambda.Function>;
|
|
25
20
|
};
|
|
26
21
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* discovery on any handler changes deployed through CDK/CloudFormation.
|
|
22
|
+
* Manage registration of a set of Lambda-deployed Restate RPC Service handlers with a Restate environment. This
|
|
23
|
+
* construct creates a custom resource which will trigger Restate service discovery on handler function changes.
|
|
30
24
|
*/
|
|
31
25
|
export declare class LambdaServiceRegistry extends Construct {
|
|
32
|
-
private readonly serviceHandlers;
|
|
33
26
|
private readonly registrationProviderToken;
|
|
27
|
+
private readonly serviceHandlers;
|
|
34
28
|
constructor(scope: Construct, id: string, props: LambdaServiceRegistryProps);
|
|
35
|
-
|
|
29
|
+
private registerServices;
|
|
36
30
|
private registerHandler;
|
|
37
31
|
}
|
|
38
|
-
export {};
|
|
@@ -38,21 +38,21 @@ const cdk = __importStar(require("aws-cdk-lib"));
|
|
|
38
38
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
39
|
const constructs_1 = require("constructs");
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* discovery on any handler changes deployed through CDK/CloudFormation.
|
|
41
|
+
* Manage registration of a set of Lambda-deployed Restate RPC Service handlers with a Restate environment. This
|
|
42
|
+
* construct creates a custom resource which will trigger Restate service discovery on handler function changes.
|
|
44
43
|
*/
|
|
45
44
|
class LambdaServiceRegistry extends constructs_1.Construct {
|
|
46
45
|
constructor(scope, id, props) {
|
|
47
46
|
super(scope, id);
|
|
48
|
-
if (Object.values(props.
|
|
47
|
+
if (Object.values(props.handlers).length == 0) {
|
|
49
48
|
throw new Error("Please specify at least one service handler.");
|
|
50
49
|
}
|
|
51
|
-
this.serviceHandlers = props.
|
|
52
|
-
this.registrationProviderToken = props.
|
|
50
|
+
this.serviceHandlers = props.handlers;
|
|
51
|
+
this.registrationProviderToken = props.environment.registrationProviderToken;
|
|
52
|
+
this.registerServices(props.environment);
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole",
|
|
54
|
+
registerServices(environment) {
|
|
55
|
+
const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole", environment.invokerRole.roleArn);
|
|
56
56
|
const allowInvokeFunction = new iam.Policy(this, "AllowInvokeFunction", {
|
|
57
57
|
statements: [
|
|
58
58
|
new iam.PolicyStatement({
|
|
@@ -65,14 +65,18 @@ class LambdaServiceRegistry extends constructs_1.Construct {
|
|
|
65
65
|
});
|
|
66
66
|
invokerRole.attachInlinePolicy(allowInvokeFunction);
|
|
67
67
|
for (const [path, handler] of Object.entries(this.serviceHandlers)) {
|
|
68
|
-
this.registerHandler(
|
|
68
|
+
this.registerHandler({
|
|
69
|
+
adminUrl: environment.adminUrl,
|
|
70
|
+
invokerRoleArn: invokerRole.roleArn,
|
|
71
|
+
authTokenSecretArn: environment.authToken?.secretArn,
|
|
72
|
+
}, { path, handler }, allowInvokeFunction);
|
|
69
73
|
}
|
|
70
74
|
}
|
|
71
75
|
registerHandler(restate, service, allowInvokeFunction) {
|
|
72
76
|
const registrar = new RestateServiceRegistrar(this, service.handler.node.id + "Discovery", {
|
|
73
|
-
restate,
|
|
77
|
+
environment: restate,
|
|
74
78
|
service,
|
|
75
|
-
serviceToken: this.registrationProviderToken,
|
|
79
|
+
serviceToken: this.registrationProviderToken.value,
|
|
76
80
|
});
|
|
77
81
|
// CloudFormation doesn't know that Restate depends on this role to call services; we must ensure that Lambda
|
|
78
82
|
// permission changes are applied before we can trigger discovery (represented by the registrar).
|
|
@@ -88,13 +92,13 @@ class RestateServiceRegistrar extends constructs_1.Construct {
|
|
|
88
92
|
resourceType: "Custom::RestateServiceRegistrar",
|
|
89
93
|
properties: {
|
|
90
94
|
servicePath: props.service.path,
|
|
91
|
-
|
|
92
|
-
authTokenSecretArn: props.
|
|
95
|
+
adminUrl: props.environment.adminUrl,
|
|
96
|
+
authTokenSecretArn: props.environment.authTokenSecretArn,
|
|
93
97
|
serviceLambdaArn: props.service.handler.currentVersion.functionArn,
|
|
94
|
-
invokeRoleArn: props.
|
|
98
|
+
invokeRoleArn: props.environment.invokerRoleArn,
|
|
95
99
|
removalPolicy: cdk.RemovalPolicy.RETAIN,
|
|
96
100
|
},
|
|
97
101
|
});
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXNlcnZpY2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsaURBQW1DO0FBQ25DLHlEQUEyQztBQUUzQywyQ0FBdUM7QUF5QnZDOzs7R0FHRztBQUNILE1BQWEscUJBQXNCLFNBQVEsc0JBQVM7SUFJbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3RDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDO1FBQzdFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQStCO1FBQ3RELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDdEUsVUFBVSxFQUFFO2dCQUNWLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdEIsR0FBRyxFQUFFLCtCQUErQjtvQkFDcEMsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUM7b0JBQ2xDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7eUJBQzNDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2lCQUM5QyxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxXQUFXLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVwRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUNuQixRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7Z0JBQzlCLGNBQWMsRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDbkMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTO2FBQ3JELEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUEyQixFQUFFLE9BR3BELEVBQUUsbUJBQStCO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDekYsV0FBVyxFQUFFLE9BQU87WUFDcEIsT0FBTztZQUNQLFlBQVksRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSztTQUNuRCxDQUFDLENBQUM7UUFFSCw2R0FBNkc7UUFDN0csaUdBQWlHO1FBQ2pHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBdkRELHNEQXVEQztBQUVELE1BQU0sdUJBQXdCLFNBQVEsc0JBQVM7SUFDN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFDNUIsS0FPQztRQUVYLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsRUFBRTtZQUN4RSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsWUFBWSxFQUFFLGlDQUFpQztZQUMvQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDL0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUTtnQkFDcEMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0I7Z0JBQ3hELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXO2dCQUNsRSxhQUFhLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjO2dCQUMvQyxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO2FBQ1A7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uUHJvcGVydGllcyB9IGZyb20gXCIuL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlclwiO1xuXG5pbXBvcnQgeyBSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5cbi8qKlxuICogQSBSZXN0YXRlIFJQQyBzZXJ2aWNlIHBhdGguIEV4YW1wbGU6IGBncmVldGVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdGF0ZVBhdGggPSBzdHJpbmc7XG5cbi8qKlxuICogTWFuYWdlIHJlZ2lzdHJhdGlvbiBvZiBhIHNldCBvZiBMYW1iZGEtZGVwbG95ZWQgUmVzdGF0ZSBSUEMgU2VydmljZSBoYW5kbGVycyB3aXRoIGEgUmVzdGF0ZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBDdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgdG9rZW4gcmVxdWlyZWQgZm9yIHNlcnZpY2UgZGlzY292ZXJ5LlxuICAgKi9cbiAgZW52aXJvbm1lbnQ6IFJlc3RhdGVFbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogTGFtYmRhIFJlc3RhdGUgc2VydmljZSBoYW5kbGVycyB0byBkZXBsb3kuXG4gICAqL1xuICBoYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xufVxuXG4vKipcbiAqIE1hbmFnZSByZWdpc3RyYXRpb24gb2YgYSBzZXQgb2YgTGFtYmRhLWRlcGxveWVkIFJlc3RhdGUgUlBDIFNlcnZpY2UgaGFuZGxlcnMgd2l0aCBhIFJlc3RhdGUgZW52aXJvbm1lbnQuIFRoaXNcbiAqIGNvbnN0cnVjdCBjcmVhdGVzIGEgY3VzdG9tIHJlc291cmNlIHdoaWNoIHdpbGwgdHJpZ2dlciBSZXN0YXRlIHNlcnZpY2UgZGlzY292ZXJ5IG9uIGhhbmRsZXIgZnVuY3Rpb24gY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYVNlcnZpY2VSZWdpc3RyeSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlSGFuZGxlcnM6IFJlY29yZDxSZXN0YXRlUGF0aCwgbGFtYmRhLkZ1bmN0aW9uPjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKE9iamVjdC52YWx1ZXMocHJvcHMuaGFuZGxlcnMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCBvbmUgc2VydmljZSBoYW5kbGVyLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZpY2VIYW5kbGVycyA9IHByb3BzLmhhbmRsZXJzO1xuICAgIHRoaXMucmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbiA9IHByb3BzLmVudmlyb25tZW50LnJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW47XG4gICAgdGhpcy5yZWdpc3RlclNlcnZpY2VzKHByb3BzLmVudmlyb25tZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJTZXJ2aWNlcyhlbnZpcm9ubWVudDogUmVzdGF0ZUVudmlyb25tZW50KSB7XG4gICAgY29uc3QgaW52b2tlclJvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCBcIkludm9rZXJSb2xlXCIsIGVudmlyb25tZW50Lmludm9rZXJSb2xlLnJvbGVBcm4pO1xuXG4gICAgY29uc3QgYWxsb3dJbnZva2VGdW5jdGlvbiA9IG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiQWxsb3dJbnZva2VGdW5jdGlvblwiLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBzaWQ6IFwiQWxsb3dJbnZva2VBbnlGdW5jdGlvblZlcnNpb25cIixcbiAgICAgICAgICBhY3Rpb25zOiBbXCJsYW1iZGE6SW52b2tlRnVuY3Rpb25cIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZUhhbmRsZXJzKVxuICAgICAgICAgICAgLm1hcChoYW5kbGVyID0+IGhhbmRsZXIuZnVuY3Rpb25Bcm4gKyBcIjoqXCIpLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpbnZva2VyUm9sZS5hdHRhY2hJbmxpbmVQb2xpY3koYWxsb3dJbnZva2VGdW5jdGlvbik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNlcnZpY2VIYW5kbGVycykpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJIYW5kbGVyKHtcbiAgICAgICAgYWRtaW5Vcmw6IGVudmlyb25tZW50LmFkbWluVXJsLFxuICAgICAgICBpbnZva2VyUm9sZUFybjogaW52b2tlclJvbGUucm9sZUFybixcbiAgICAgICAgYXV0aFRva2VuU2VjcmV0QXJuOiBlbnZpcm9ubWVudC5hdXRoVG9rZW4/LnNlY3JldEFybixcbiAgICAgIH0sIHsgcGF0aCwgaGFuZGxlciB9LCBhbGxvd0ludm9rZUZ1bmN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlcihyZXN0YXRlOiBFbnZpcm9ubWVudERldGFpbHMsIHNlcnZpY2U6IHtcbiAgICBwYXRoOiBSZXN0YXRlUGF0aCxcbiAgICBoYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb25cbiAgfSwgYWxsb3dJbnZva2VGdW5jdGlvbjogaWFtLlBvbGljeSkge1xuICAgIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBSZXN0YXRlU2VydmljZVJlZ2lzdHJhcih0aGlzLCBzZXJ2aWNlLmhhbmRsZXIubm9kZS5pZCArIFwiRGlzY292ZXJ5XCIsIHtcbiAgICAgIGVudmlyb25tZW50OiByZXN0YXRlLFxuICAgICAgc2VydmljZSxcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuLnZhbHVlLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gZG9lc24ndCBrbm93IHRoYXQgUmVzdGF0ZSBkZXBlbmRzIG9uIHRoaXMgcm9sZSB0byBjYWxsIHNlcnZpY2VzOyB3ZSBtdXN0IGVuc3VyZSB0aGF0IExhbWJkYVxuICAgIC8vIHBlcm1pc3Npb24gY2hhbmdlcyBhcmUgYXBwbGllZCBiZWZvcmUgd2UgY2FuIHRyaWdnZXIgZGlzY292ZXJ5IChyZXByZXNlbnRlZCBieSB0aGUgcmVnaXN0cmFyKS5cbiAgICByZWdpc3RyYXIubm9kZS5hZGREZXBlbmRlbmN5KGFsbG93SW52b2tlRnVuY3Rpb24pO1xuICB9XG59XG5cbmNsYXNzIFJlc3RhdGVTZXJ2aWNlUmVnaXN0cmFyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnREZXRhaWxzLFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IHtcbiAgICAgICAgICAgICAgICAgIHBhdGg6IFJlc3RhdGVQYXRoLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlVG9rZW46IHN0cmluZyxcbiAgICAgICAgICAgICAgfSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgcHJvcHMuc2VydmljZS5oYW5kbGVyLm5vZGUuaWQgKyBcIkRpc2NvdmVyeVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlJlc3RhdGVTZXJ2aWNlUmVnaXN0cmFyXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNlcnZpY2VQYXRoOiBwcm9wcy5zZXJ2aWNlLnBhdGgsXG4gICAgICAgIGFkbWluVXJsOiBwcm9wcy5lbnZpcm9ubWVudC5hZG1pblVybCxcbiAgICAgICAgYXV0aFRva2VuU2VjcmV0QXJuOiBwcm9wcy5lbnZpcm9ubWVudC5hdXRoVG9rZW5TZWNyZXRBcm4sXG4gICAgICAgIHNlcnZpY2VMYW1iZGFBcm46IHByb3BzLnNlcnZpY2UuaGFuZGxlci5jdXJyZW50VmVyc2lvbi5mdW5jdGlvbkFybixcbiAgICAgICAgaW52b2tlUm9sZUFybjogcHJvcHMuZW52aXJvbm1lbnQuaW52b2tlclJvbGVBcm4sXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIH0gc2F0aXNmaWVzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEVudmlyb25tZW50RGV0YWlscyB7XG4gIHJlYWRvbmx5IGFkbWluVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcbn0iXX0=
|
|
@@ -3,8 +3,7 @@ import { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudforma
|
|
|
3
3
|
import * as cdk from "aws-cdk-lib";
|
|
4
4
|
export interface RegistrationProperties {
|
|
5
5
|
servicePath?: string;
|
|
6
|
-
|
|
7
|
-
serviceEndpoint?: string;
|
|
6
|
+
adminUrl?: string;
|
|
8
7
|
serviceLambdaArn?: string;
|
|
9
8
|
invokeRoleArn?: string;
|
|
10
9
|
removalPolicy?: cdk.RemovalPolicy;
|
|
@@ -40,9 +40,12 @@ exports.handler = void 0;
|
|
|
40
40
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
41
41
|
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
42
42
|
const https = __importStar(require("https"));
|
|
43
|
-
const
|
|
43
|
+
const crypto_1 = require("crypto");
|
|
44
|
+
const MAX_HEALTH_CHECK_ATTEMPTS = 5; // This is intentionally quite long to allow some time for first-run EC2 and Docker boot up
|
|
44
45
|
const MAX_REGISTRATION_ATTEMPTS = 3;
|
|
45
46
|
const INSECURE = true;
|
|
47
|
+
const DEPLOYMENTS_PATH = "deployments";
|
|
48
|
+
const DEPLOYMENTS_PATH_LEGACY = "endpoints"; // temporarily fall back for legacy clusters
|
|
46
49
|
/**
|
|
47
50
|
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
48
51
|
* {@link LambdaServiceRegistry} to facilitate Lambda service handler discovery.
|
|
@@ -60,7 +63,7 @@ const handler = async function (event) {
|
|
|
60
63
|
// const controller = new AbortController();
|
|
61
64
|
// const id = btoa(props.serviceLambdaArn!); // TODO: we should be treating service ids as opaque
|
|
62
65
|
// const deleteCallTimeout = setTimeout(() => controller.abort("timeout"), 5_000);
|
|
63
|
-
// const deleteResponse = await fetch(`${props.
|
|
66
|
+
// const deleteResponse = await fetch(`${props.adminUrl}/${DEPLOYMENTS_PATH}/${id}?force=true`, {
|
|
64
67
|
// signal: controller.signal,
|
|
65
68
|
// method: "DELETE",
|
|
66
69
|
// agent: INSECURE ? new https.Agent({ rejectUnauthorized: false }) : undefined,
|
|
@@ -68,7 +71,7 @@ const handler = async function (event) {
|
|
|
68
71
|
//
|
|
69
72
|
// console.log(`Got delete response back: ${deleteResponse.status}`);
|
|
70
73
|
// if (deleteResponse.status != 202) {
|
|
71
|
-
// throw new Error(`
|
|
74
|
+
// throw new Error(`Removing service deployment failed: ${deleteResponse.statusText} (${deleteResponse.status})`);
|
|
72
75
|
// }
|
|
73
76
|
// }
|
|
74
77
|
console.warn("De-registering services is not supported currently. Previous version will remain registered.");
|
|
@@ -78,7 +81,7 @@ const handler = async function (event) {
|
|
|
78
81
|
const authHeader = await createAuthHeader(props);
|
|
79
82
|
let attempt;
|
|
80
83
|
const controller = new AbortController();
|
|
81
|
-
const healthCheckUrl = `${props.
|
|
84
|
+
const healthCheckUrl = `${props.adminUrl}/health`;
|
|
82
85
|
console.log(`Performing health check against: ${healthCheckUrl}`);
|
|
83
86
|
attempt = 1;
|
|
84
87
|
while (true) {
|
|
@@ -101,27 +104,27 @@ const handler = async function (event) {
|
|
|
101
104
|
errorMessage = e?.message;
|
|
102
105
|
console.error(`Restate health check failed: "${errorMessage}" (attempt ${attempt})`);
|
|
103
106
|
}
|
|
104
|
-
if (attempt
|
|
105
|
-
console.error(`
|
|
107
|
+
if (attempt >= MAX_HEALTH_CHECK_ATTEMPTS) {
|
|
108
|
+
console.error(`Admin service health check failing after ${attempt} attempts.`);
|
|
106
109
|
throw new Error(errorMessage ?? `${healthResponse?.statusText} (${healthResponse?.status})`);
|
|
107
110
|
}
|
|
108
111
|
attempt += 1;
|
|
109
|
-
const waitTimeMillis = 2 ** attempt * 1000;
|
|
112
|
+
const waitTimeMillis = (0, crypto_1.randomInt)(2000) + 2 ** attempt * 1000; // 3s -> 6s -> 10s -> 18s -> 34s
|
|
110
113
|
console.log(`Retrying after ${waitTimeMillis} ms...`);
|
|
111
114
|
await sleep(waitTimeMillis);
|
|
112
115
|
}
|
|
113
|
-
|
|
116
|
+
let deploymentsUrl = `${props.adminUrl}/${DEPLOYMENTS_PATH}`;
|
|
114
117
|
const registrationRequest = JSON.stringify({
|
|
115
118
|
arn: props.serviceLambdaArn,
|
|
116
119
|
assume_role_arn: props.invokeRoleArn,
|
|
117
120
|
});
|
|
118
121
|
let failureReason;
|
|
119
|
-
console.log(`Triggering registration at ${
|
|
122
|
+
console.log(`Triggering registration at ${deploymentsUrl}: ${registrationRequest}`);
|
|
120
123
|
attempt = 1;
|
|
121
124
|
while (true) {
|
|
122
125
|
try {
|
|
123
126
|
const registerCallTimeout = setTimeout(() => controller.abort("timeout"), 10000);
|
|
124
|
-
const
|
|
127
|
+
const registerDeploymentResponse = await (0, node_fetch_1.default)(deploymentsUrl, {
|
|
125
128
|
signal: controller.signal,
|
|
126
129
|
method: "POST",
|
|
127
130
|
body: registrationRequest,
|
|
@@ -131,9 +134,13 @@ const handler = async function (event) {
|
|
|
131
134
|
},
|
|
132
135
|
agent: INSECURE ? new https.Agent({ rejectUnauthorized: false }) : undefined,
|
|
133
136
|
}).finally(() => clearTimeout(registerCallTimeout));
|
|
134
|
-
console.log(`Got registration response back: ${
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
+
console.log(`Got registration response back: ${registerDeploymentResponse.status}`);
|
|
138
|
+
if (registerDeploymentResponse.status == 404 && attempt == 1) {
|
|
139
|
+
deploymentsUrl = `${props.adminUrl}/${DEPLOYMENTS_PATH_LEGACY}`;
|
|
140
|
+
console.log(`Got 404, falling back to <0.7.0 legacy endpoint registration at: ${deploymentsUrl}`);
|
|
141
|
+
}
|
|
142
|
+
if (registerDeploymentResponse.status >= 200 && registerDeploymentResponse.status < 300) {
|
|
143
|
+
const response = (await registerDeploymentResponse.json());
|
|
137
144
|
if (response?.services?.[0]?.name !== props.servicePath) {
|
|
138
145
|
failureReason =
|
|
139
146
|
"Restate service registration failed: service name indicated by service response" +
|
|
@@ -147,13 +154,14 @@ const handler = async function (event) {
|
|
|
147
154
|
}
|
|
148
155
|
catch (e) {
|
|
149
156
|
console.error(`Service registration call failed: ${e?.message} (attempt ${attempt})`);
|
|
157
|
+
failureReason = `Restate service registration failed: ${e?.message}`;
|
|
150
158
|
}
|
|
151
|
-
if (attempt
|
|
159
|
+
if (attempt >= MAX_REGISTRATION_ATTEMPTS) {
|
|
152
160
|
console.error(`Service registration failed after ${attempt} attempts.`);
|
|
153
161
|
break;
|
|
154
162
|
}
|
|
155
163
|
attempt += 1;
|
|
156
|
-
const waitTimeMillis = 2000 + 2 ** attempt * 1000; // 3s -> 6s -> 10s
|
|
164
|
+
const waitTimeMillis = (0, crypto_1.randomInt)(2000) + 2 ** attempt * 1000; // 3s -> 6s -> 10s
|
|
157
165
|
console.log(`Retrying registration after ${waitTimeMillis} ms...`);
|
|
158
166
|
await sleep(waitTimeMillis);
|
|
159
167
|
}
|
|
@@ -177,4 +185,4 @@ async function createAuthHeader(props) {
|
|
|
177
185
|
async function sleep(millis) {
|
|
178
186
|
await new Promise((resolve) => setTimeout(resolve, millis));
|
|
179
187
|
}
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsNkNBQStCO0FBaUIvQixNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUVwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFFdEI7OztHQUdHO0FBQ0ksTUFBTSxPQUFPLEdBQXFELEtBQUssV0FBVyxLQUFLO0lBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXZCLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7UUFDbEMsaUhBQWlIO1FBQ2pILDJHQUEyRztRQUMzRywrR0FBK0c7UUFDL0csdUJBQXVCO1FBRXZCLG9FQUFvRTtRQUNwRSwyREFBMkQ7UUFDM0QscUVBQXFFO1FBQ3JFLDhDQUE4QztRQUM5QyxtR0FBbUc7UUFDbkcsb0ZBQW9GO1FBQ3BGLDZGQUE2RjtRQUM3RixpQ0FBaUM7UUFDakMsd0JBQXdCO1FBQ3hCLG9GQUFvRjtRQUNwRix1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLHVFQUF1RTtRQUN2RSx3Q0FBd0M7UUFDeEMsb0hBQW9IO1FBQ3BILE1BQU07UUFDTixJQUFJO1FBRUosT0FBTyxDQUFDLElBQUksQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO1FBQzdHLE9BQU87S0FDUjtJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpELElBQUks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RixPQUFPO1FBQ0wsYUFBYSxFQUFFLFVBQVUsUUFBUSxDQUFDLFlBQVksRUFBRTtLQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxLQUFLLENBQUMsTUFBYztJQUNqQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBTREsgZm9yIE5vZGUuanMvVHlwZVNjcmlwdCxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcImF3cy1sYW1iZGEvaGFuZGxlclwiO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGEvdHJpZ2dlci9jbG91ZGZvcm1hdGlvbi1jdXN0b20tcmVzb3VyY2VcIjtcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgR2V0U2VjcmV0VmFsdWVDb21tYW5kLCBTZWNyZXRzTWFuYWdlckNsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tIFwiaHR0cHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgc2VydmljZVBhdGg/OiBzdHJpbmc7XG4gIG1ldGFFbmRwb2ludD86IHN0cmluZztcbiAgc2VydmljZUVuZHBvaW50Pzogc3RyaW5nO1xuICBzZXJ2aWNlTGFtYmRhQXJuPzogc3RyaW5nO1xuICBpbnZva2VSb2xlQXJuPzogc3RyaW5nO1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG4gIGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcbn1cblxudHlwZSBFbmRwb2ludFJlc3BvbnNlID0ge1xuICBpZD86IHN0cmluZztcbiAgc2VydmljZXM/OiB7IG5hbWU/OiBzdHJpbmc7IHJldmlzaW9uPzogbnVtYmVyIH1bXTtcbn07XG5cbmNvbnN0IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUyA9IDM7XG5cbmNvbnN0IElOU0VDVVJFID0gdHJ1ZTtcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBMYW1iZGFTZXJ2aWNlUmVnaXN0cnl9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgdm9pZD4gPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAvLyBTaW5jZSB3ZSByZXRhaW4gb2xkZXIgTGFtYmRhIGhhbmRsZXIgdmVyc2lvbnMgb24gdXBkYXRlLCB3ZSBhbHNvIGxlYXZlIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgYWxvbmUuIFRoZXJlIG1heVxuICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgLy8gdmVyc2lvbiBmcm9tIExhbWJkYS5cblxuICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGBEZS1yZWdpc3RlcmluZyBzZXJ2aWNlICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcbiAgICAvLyAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgLy8gICBjb25zdCBkZWxldGVDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMubWV0YUVuZHBvaW50fS9lbmRwb2ludHMvJHtpZH0/Zm9yY2U9dHJ1ZWAsIHtcbiAgICAvLyAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAvLyAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIC8vICAgICBhZ2VudDogSU5TRUNVUkUgPyBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0pIDogdW5kZWZpbmVkLFxuICAgIC8vICAgfSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQoZGVsZXRlQ2FsbFRpbWVvdXQpKTtcbiAgICAvL1xuICAgIC8vICAgY29uc29sZS5sb2coYEdvdCBkZWxldGUgcmVzcG9uc2UgYmFjazogJHtkZWxldGVSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgLy8gICBpZiAoZGVsZXRlUmVzcG9uc2Uuc3RhdHVzICE9IDIwMikge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGV0aW5nIHNlcnZpY2UgZW5kcG9pbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVnaXN0cmF0aW9uUHJvcGVydGllcztcbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMubWV0YUVuZHBvaW50fS9oZWFsdGhgO1xuXG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICBhdHRlbXB0ID0gMTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBoZWFsdGhDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgbGV0IGhlYWx0aFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhlYWx0aFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaGVhbHRoQ2hlY2tVcmwsIHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgaGVhZGVyczogYXV0aEhlYWRlcixcbiAgICAgICAgYWdlbnQ6IElOU0VDVVJFID8gbmV3IGh0dHBzLkFnZW50KHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGhlYWx0aENoZWNrVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIGlmIChoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfTsgYXR0ZW1wdCAke2F0dGVtcHR9KWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogXCIke2Vycm9yTWVzc2FnZX1cIiAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID4gTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcihgTWV0YSBoZWFsdGggY2hlY2sgc3RpbGwgZmFpbGluZyBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSA/PyBgJHtoZWFsdGhSZXNwb25zZT8uc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c30pYCk7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcblxuICAgIGNvbnN0IHdhaXRUaW1lTWlsbGlzID0gMiAqKiBhdHRlbXB0ICogMV8wMDA7XG4gICAgY29uc29sZS5sb2coYFJldHJ5aW5nIGFmdGVyICR7d2FpdFRpbWVNaWxsaXN9IG1zLi4uYCk7XG4gICAgYXdhaXQgc2xlZXAod2FpdFRpbWVNaWxsaXMpO1xuICB9XG5cbiAgY29uc3QgZW5kcG9pbnRzVXJsID0gYCR7cHJvcHMubWV0YUVuZHBvaW50fS9lbmRwb2ludHNgO1xuICBjb25zdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGFybjogcHJvcHMuc2VydmljZUxhbWJkYUFybixcbiAgICBhc3N1bWVfcm9sZV9hcm46IHByb3BzLmludm9rZVJvbGVBcm4sXG4gIH0pO1xuXG4gIGxldCBmYWlsdXJlUmVhc29uO1xuICBjb25zb2xlLmxvZyhgVHJpZ2dlcmluZyByZWdpc3RyYXRpb24gYXQgJHtlbmRwb2ludHNVcmx9OiAke3JlZ2lzdHJhdGlvblJlcXVlc3R9YCk7XG4gIGF0dGVtcHQgPSAxO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdpc3RlckNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyeVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnRzVXJsLCB7XG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IHJlZ2lzdHJhdGlvblJlcXVlc3QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBhZ2VudDogSU5TRUNVUkUgPyBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0pIDogdW5kZWZpbmVkLFxuICAgICAgfSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQocmVnaXN0ZXJDYWxsVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IHJlZ2lzdHJhdGlvbiByZXNwb25zZSBiYWNrOiAke2Rpc2NvdmVyeVJlc3BvbnNlLnN0YXR1c31gKTtcblxuICAgICAgaWYgKGRpc2NvdmVyeVJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGRpc2NvdmVyeVJlc3BvbnNlLmpzb24oKSkgYXMgRW5kcG9pbnRSZXNwb25zZTtcblxuICAgICAgICBpZiAocmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWUgIT09IHByb3BzLnNlcnZpY2VQYXRoKSB7XG4gICAgICAgICAgZmFpbHVyZVJlYXNvbiA9XG4gICAgICAgICAgICBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiBzZXJ2aWNlIG5hbWUgaW5kaWNhdGVkIGJ5IHNlcnZpY2UgcmVzcG9uc2VcIiArXG4gICAgICAgICAgICBgIChcIiR7cmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWV9KSkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIChcIiR7cHJvcHMuc2VydmljZVBhdGh9XCIpIWA7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmYWlsdXJlUmVhc29uKTtcbiAgICAgICAgICBicmVhazsgLy8gZG9uJ3QgdGhyb3cgaW1tZWRpYXRlbHkgLSBsZXQgcmV0cnkgbG9vcCBkZWNpZGUgd2hldGhlciB0byBhYm9ydFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzIVwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGNhbGwgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX0gKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IDJfMDAwICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwc1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyByZWdpc3RyYXRpb24gYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZVJlYXNvbiA/PyBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yIGRldGFpbHMuXCIpO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aEhlYWRlcihwcm9wczogUmVnaXN0cmF0aW9uUHJvcGVydGllcyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBpZiAoIXByb3BzLmF1dGhUb2tlblNlY3JldEFybikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBVc2luZyBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4gZnJvbSBzZWNyZXQgJHtwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm59YCk7XG4gIGNvbnN0IHNzbSA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbS5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IHByb3BzLmF1dGhUb2tlblNlY3JldEFybixcbiAgICB9KSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBzZWNyZXQgXCIke3Jlc3BvbnNlLk5hbWV9XCIgdmVyc2lvbiAke3Jlc3BvbnNlLlZlcnNpb25JZH1gKTtcbiAgcmV0dXJuIHtcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cmVzcG9uc2UuU2VjcmV0U3RyaW5nfWAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpczogbnVtYmVyKSB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpcykpO1xufVxuIl19
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsNkNBQStCO0FBQy9CLG1DQUFtQztBQWdCbkMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUMsQ0FBQywyRkFBMkY7QUFDaEksTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBRXRCLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsV0FBVyxDQUFDLENBQUMsNENBQTRDO0FBRXpGOzs7R0FHRztBQUNJLE1BQU0sT0FBTyxHQUFxRCxLQUFLLFdBQVUsS0FBSztJQUMzRixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV2QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsaUhBQWlIO1FBQ2pILDJHQUEyRztRQUMzRywrR0FBK0c7UUFDL0csdUJBQXVCO1FBRXZCLG9FQUFvRTtRQUNwRSwyREFBMkQ7UUFDM0QscUVBQXFFO1FBQ3JFLDhDQUE4QztRQUM5QyxtR0FBbUc7UUFDbkcsb0ZBQW9GO1FBQ3BGLG1HQUFtRztRQUNuRyxpQ0FBaUM7UUFDakMsd0JBQXdCO1FBQ3hCLG9GQUFvRjtRQUNwRix1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLHVFQUF1RTtRQUN2RSx3Q0FBd0M7UUFDeEMsc0hBQXNIO1FBQ3RILE1BQU07UUFDTixJQUFJO1FBRUosT0FBTyxDQUFDLElBQUksQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO1FBQzdHLE9BQU87SUFD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QU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxtRUFBbUUsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQXZJVyxRQUFBLE9BQU8sV0F1SWxCO0FBRUYsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQTZCO0lBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sR0FBRyxHQUFHLElBQUksNkNBQW9CLEVBQUUsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQzdCLElBQUksOENBQXFCLENBQUM7UUFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0I7S0FDbkMsQ0FBQyxDQUNILENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxRQUFRLENBQUMsSUFBSSxhQUFhLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLE9BQU87UUFDTCxhQUFhLEVBQUUsVUFBVSxRQUFRLENBQUMsWUFBWSxFQUFFO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLEtBQUssQ0FBQyxNQUFjO0lBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEhhbmRsZXIgfSBmcm9tIFwiYXdzLWxhbWJkYS9oYW5kbGVyXCI7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQgfSBmcm9tIFwiYXdzLWxhbWJkYS90cmlnZ2VyL2Nsb3VkZm9ybWF0aW9uLWN1c3RvbS1yZXNvdXJjZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXJcIjtcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJodHRwc1wiO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcImNyeXB0b1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMge1xuICBzZXJ2aWNlUGF0aD86IHN0cmluZztcbiAgYWRtaW5Vcmw/OiBzdHJpbmc7XG4gIHNlcnZpY2VMYW1iZGFBcm4/OiBzdHJpbmc7XG4gIGludm9rZVJvbGVBcm4/OiBzdHJpbmc7XG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcbiAgYXV0aFRva2VuU2VjcmV0QXJuPzogc3RyaW5nO1xufVxuXG50eXBlIFJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlID0ge1xuICBpZD86IHN0cmluZztcbiAgc2VydmljZXM/OiB7IG5hbWU/OiBzdHJpbmc7IHJldmlzaW9uPzogbnVtYmVyIH1bXTtcbn07XG5cbmNvbnN0IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMgPSA1OyAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcXVpdGUgbG9uZyB0byBhbGxvdyBzb21lIHRpbWUgZm9yIGZpcnN0LXJ1biBFQzIgYW5kIERvY2tlciBib290IHVwXG5jb25zdCBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTID0gMztcblxuY29uc3QgSU5TRUNVUkUgPSB0cnVlO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgREVQTE9ZTUVOVFNfUEFUSF9MRUdBQ1kgPSBcImVuZHBvaW50c1wiOyAvLyB0ZW1wb3JhcmlseSBmYWxsIGJhY2sgZm9yIGxlZ2FjeSBjbHVzdGVyc1xuXG4vKipcbiAqIEN1c3RvbSBSZXNvdXJjZSBldmVudCBoYW5kbGVyIGZvciBSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uLiBUaGlzIGhhbmRsZXIgYmFja3MgdGhlIGN1c3RvbSByZXNvdXJjZXMgY3JlYXRlZCBieVxuICoge0BsaW5rIExhbWJkYVNlcnZpY2VSZWdpc3RyeX0gdG8gZmFjaWxpdGF0ZSBMYW1iZGEgc2VydmljZSBoYW5kbGVyIGRpc2NvdmVyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXI6IEhhbmRsZXI8Q2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCB2b2lkPiA9IGFzeW5jIGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGNvbnNvbGUubG9nKHsgZXZlbnQgfSk7XG5cbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSBcIkRlbGV0ZVwiKSB7XG4gICAgLy8gU2luY2Ugd2UgcmV0YWluIG9sZGVyIExhbWJkYSBoYW5kbGVyIHZlcnNpb25zIG9uIHVwZGF0ZSwgd2UgYWxzbyBsZWF2ZSB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIGFsb25lLiBUaGVyZSBtYXlcbiAgICAvLyBiZSB1bmZpbmlzaGVkIGludm9jYXRpb25zIHRoYXQgcmVxdWlyZSBpdDsgaW4gdGhlIGZ1dHVyZSB3ZSB3b3VsZCB3YW50IHRvIGluZm9ybSBSZXN0YXRlIHRoYXQgd2Ugd2FudCB0b1xuICAgIC8vIGRlLXJlZ2lzdGVyIHRoZSBzZXJ2aWNlLCBhbmQgd2FpdCBmb3IgUmVzdGF0ZSB0byBsZXQgdXMga25vdyB0aGF0IGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBkZXBsb3llZCBGdW5jdGlvblxuICAgIC8vIHZlcnNpb24gZnJvbSBMYW1iZGEuXG5cbiAgICAvLyBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuICAgIC8vIGlmIChwcm9wcy5yZW1vdmFsUG9saWN5ID09PSBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhgRGUtcmVnaXN0ZXJpbmcgc2VydmljZSAke3Byb3BzLnNlcnZpY2VMYW1iZGFBcm59YCk7XG4gICAgLy8gICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIC8vICAgY29uc3QgaWQgPSBidG9hKHByb3BzLnNlcnZpY2VMYW1iZGFBcm4hKTsgLy8gVE9ETzogd2Ugc2hvdWxkIGJlIHRyZWF0aW5nIHNlcnZpY2UgaWRzIGFzIG9wYXF1ZVxuICAgIC8vICAgY29uc3QgZGVsZXRlQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgLy8gICBjb25zdCBkZWxldGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9LyR7aWR9P2ZvcmNlPXRydWVgLCB7XG4gICAgLy8gICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgLy8gICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAvLyAgICAgYWdlbnQ6IElOU0VDVVJFID8gbmV3IGh0dHBzLkFnZW50KHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9KSA6IHVuZGVmaW5lZCxcbiAgICAvLyAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGRlbGV0ZUNhbGxUaW1lb3V0KSk7XG4gICAgLy9cbiAgICAvLyAgIGNvbnNvbGUubG9nKGBHb3QgZGVsZXRlIHJlc3BvbnNlIGJhY2s6ICR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIC8vICAgaWYgKGRlbGV0ZVJlc3BvbnNlLnN0YXR1cyAhPSAyMDIpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdmluZyBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVnaXN0cmF0aW9uUHJvcGVydGllcztcbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMuYWRtaW5Vcmx9L2hlYWx0aGA7XG5cbiAgY29uc29sZS5sb2coYFBlcmZvcm1pbmcgaGVhbHRoIGNoZWNrIGFnYWluc3Q6ICR7aGVhbHRoQ2hlY2tVcmx9YCk7XG4gIGF0dGVtcHQgPSAxO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGhlYWx0aENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICBsZXQgaGVhbHRoUmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhDaGVja1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiBhdXRoSGVhZGVyLFxuICAgICAgICBhZ2VudDogSU5TRUNVUkUgPyBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0pIDogdW5kZWZpbmVkLFxuICAgICAgfSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQoaGVhbHRoQ2hlY2tUaW1lb3V0KSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGBHb3QgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGJhY2s6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgaWYgKGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgaGVhbHRoUmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtoZWFsdGhSZXNwb25zZS5zdGF0dXN9OyBhdHRlbXB0ICR7YXR0ZW1wdH0pYCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgICAgY29uc29sZS5lcnJvcihgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiBcIiR7ZXJyb3JNZXNzYWdlfVwiIChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPj0gTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcihgQWRtaW4gc2VydmljZSBoZWFsdGggY2hlY2sgZmFpbGluZyBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSA/PyBgJHtoZWFsdGhSZXNwb25zZT8uc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c30pYCk7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcblxuICAgIGNvbnN0IHdhaXRUaW1lTWlsbGlzID0gcmFuZG9tSW50KDJfMDAwKSArIDIgKiogYXR0ZW1wdCAqIDFfMDAwOyAvLyAzcyAtPiA2cyAtPiAxMHMgLT4gMThzIC0+IDM0c1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyBhZnRlciAke3dhaXRUaW1lTWlsbGlzfSBtcy4uLmApO1xuICAgIGF3YWl0IHNsZWVwKHdhaXRUaW1lTWlsbGlzKTtcbiAgfVxuXG4gIGxldCBkZXBsb3ltZW50c1VybCA9IGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9YDtcbiAgY29uc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBhcm46IHByb3BzLnNlcnZpY2VMYW1iZGFBcm4sXG4gICAgYXNzdW1lX3JvbGVfYXJuOiBwcm9wcy5pbnZva2VSb2xlQXJuLFxuICB9KTtcblxuICBsZXQgZmFpbHVyZVJlYXNvbjtcbiAgY29uc29sZS5sb2coYFRyaWdnZXJpbmcgcmVnaXN0cmF0aW9uIGF0ICR7ZGVwbG95bWVudHNVcmx9OiAke3JlZ2lzdHJhdGlvblJlcXVlc3R9YCk7XG4gIGF0dGVtcHQgPSAxO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdpc3RlckNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZGVwbG95bWVudHNVcmwsIHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgYm9keTogcmVnaXN0cmF0aW9uUmVxdWVzdCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIC4uLmF1dGhIZWFkZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGFnZW50OiBJTlNFQ1VSRSA/IG5ldyBodHRwcy5BZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSkgOiB1bmRlZmluZWQsXG4gICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChyZWdpc3RlckNhbGxUaW1lb3V0KSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGBHb3QgcmVnaXN0cmF0aW9uIHJlc3BvbnNlIGJhY2s6ICR7cmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzfWApO1xuXG4gICAgICBpZiAocmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzID09IDQwNCAmJiBhdHRlbXB0ID09IDEpIHtcbiAgICAgICAgZGVwbG95bWVudHNVcmwgPSBgJHtwcm9wcy5hZG1pblVybH0vJHtERVBMT1lNRU5UU19QQVRIX0xFR0FDWX1gO1xuICAgICAgICBjb25zb2xlLmxvZyhgR290IDQwNCwgZmFsbGluZyBiYWNrIHRvIDwwLjcuMCBsZWdhY3kgZW5kcG9pbnQgcmVnaXN0cmF0aW9uIGF0OiAke2RlcGxveW1lbnRzVXJsfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UuanNvbigpKSBhcyBSZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZTtcblxuICAgICAgICBpZiAocmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWUgIT09IHByb3BzLnNlcnZpY2VQYXRoKSB7XG4gICAgICAgICAgZmFpbHVyZVJlYXNvbiA9XG4gICAgICAgICAgICBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiBzZXJ2aWNlIG5hbWUgaW5kaWNhdGVkIGJ5IHNlcnZpY2UgcmVzcG9uc2VcIiArXG4gICAgICAgICAgICBgIChcIiR7cmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWV9KSkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIChcIiR7cHJvcHMuc2VydmljZVBhdGh9XCIpIWA7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmYWlsdXJlUmVhc29uKTtcbiAgICAgICAgICBicmVhazsgLy8gZG9uJ3QgdGhyb3cgaW1tZWRpYXRlbHkgLSBsZXQgcmV0cnkgbG9vcCBkZWNpZGUgd2hldGhlciB0byBhYm9ydFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzIVwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGNhbGwgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX0gKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICAgIGZhaWx1cmVSZWFzb24gPSBgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPj0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcihgU2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkIGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHMuYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IHdhaXRUaW1lTWlsbGlzID0gcmFuZG9tSW50KDJfMDAwKSArIDIgKiogYXR0ZW1wdCAqIDFfMDAwOyAvLyAzcyAtPiA2cyAtPiAxMHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgcmVnaXN0cmF0aW9uIGFmdGVyICR7d2FpdFRpbWVNaWxsaXN9IG1zLi4uYCk7XG4gICAgYXdhaXQgc2xlZXAod2FpdFRpbWVNaWxsaXMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVSZWFzb24gPz8gXCJSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC4gUGxlYXNlIHNlZSBsb2dzIGZvciBkZXRhaWxzLlwiKTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhIZWFkZXIocHJvcHM6IFJlZ2lzdHJhdGlvblByb3BlcnRpZXMpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgaWYgKCFwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4pIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zb2xlLmxvZyhgVXNpbmcgYmVhcmVyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZyb20gc2VjcmV0ICR7cHJvcHMuYXV0aFRva2VuU2VjcmV0QXJufWApO1xuICBjb25zdCBzc20gPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzc20uc2VuZChcbiAgICBuZXcgR2V0U2VjcmV0VmFsdWVDb21tYW5kKHtcbiAgICAgIFNlY3JldElkOiBwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4sXG4gICAgfSksXG4gICk7XG5cbiAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgc2VjcmV0IFwiJHtyZXNwb25zZS5OYW1lfVwiIHZlcnNpb24gJHtyZXNwb25zZS5WZXJzaW9uSWR9YCk7XG4gIHJldHVybiB7XG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Jlc3BvbnNlLlNlY3JldFN0cmluZ31gLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXMpKTtcbn1cbiJdfQ==
|
|
@@ -43,7 +43,7 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
43
43
|
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
44
44
|
const cdk = __importStar(require("aws-cdk-lib"));
|
|
45
45
|
const cr = __importStar(require("aws-cdk-lib/custom-resources"));
|
|
46
|
-
const DEFAULT_TIMEOUT = cdk.Duration.seconds(
|
|
46
|
+
const DEFAULT_TIMEOUT = cdk.Duration.seconds(180);
|
|
47
47
|
class RegistrationProvider extends constructs_1.Construct {
|
|
48
48
|
constructor(scope, id, props) {
|
|
49
49
|
super(scope, id);
|
|
@@ -74,4 +74,4 @@ class RegistrationProvider extends constructs_1.Construct {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
exports.RegistrationProvider = RegistrationProvider;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9yZWdpc3RyYXRpb24tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwyQ0FBdUM7QUFFdkMsMkVBQTZEO0FBQzdELDBEQUE2QjtBQUM3QiwrREFBaUQ7QUFDakQsaURBQW1DO0FBQ25DLGlFQUFtRDtBQUduRCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVsRCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBR2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUU7UUFDakgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUN0RixXQUFXLEVBQUUscUNBQXFDO1lBQ2xELEtBQUssRUFBRSxtQkFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsbUNBQW1DLENBQUM7WUFDaEUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUN4QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3JDLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksZUFBZTtZQUN6QyxXQUFXLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLHNCQUFzQjthQUNyQztZQUNELFFBQVEsRUFBRTtnQkFDUixNQUFNLEVBQUUsS0FBSztnQkFDYixTQUFTLEVBQUUsSUFBSTthQUNoQjtZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDNUUsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVoRCxNQUFNLG9CQUFvQixHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDekUsY0FBYyxFQUFFLG1CQUFtQjtTQUNwQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQztJQUN4RCxDQUFDO0NBQ0Y7QUFqQ0Qsb0RBaUNDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0ICogYXMgbGFtYmRhX25vZGUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcblxuY29uc3QgREVGQVVMVF9USU1FT1VUID0gY2RrLkR1cmF0aW9uLnNlY29uZHMoMTgwKTtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IHsgYXV0aFRva2VuPzogc3NtLklTZWNyZXQ7IHRpbWVvdXQ/OiBjZGsuRHVyYXRpb247IHZwYz86IGVjMi5WcGMgfSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlVzaW5nIFZQQyFcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uSGFuZGxlciA9IG5ldyBsYW1iZGFfbm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIlJlZ2lzdHJhdGlvbkhhbmRsZXJcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiUmVzdGF0ZSBjdXN0b20gcmVnaXN0cmF0aW9uIGhhbmRsZXJcIixcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcInJlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC5qc1wiKSxcbiAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhLkFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfTEFURVNULFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX09QVElPTlM6IFwiLS1lbmFibGUtc291cmNlLW1hcHNcIixcbiAgICAgIH0sXG4gICAgICBidW5kbGluZzoge1xuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICB9LFxuICAgICAgLi4uKHByb3BzLnZwYyA/IHsgdnBjOiBwcm9wcy52cGMsIHN1Ym5ldHM6IHByb3BzLnZwYy5wcml2YXRlU3VibmV0cyB9IDoge30pLFxuICAgIH0pO1xuICAgIHByb3BzLmF1dGhUb2tlbj8uZ3JhbnRSZWFkKHJlZ2lzdHJhdGlvbkhhbmRsZXIpO1xuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uUHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogcmVnaXN0cmF0aW9uSGFuZGxlcixcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgfVxufVxuIl19
|
|
@@ -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 { RestateEnvironment } from "./restate-environment";
|
|
6
|
+
export interface RestateCloudEnvironmentProps {
|
|
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 for Restate environment. Used with the admin service for service deployment registration. */
|
|
12
|
+
authTokenSecretArn: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Restate environment hosted on Restate Cloud. This construct manages the role in the deployment environment that
|
|
16
|
+
* Restate Cloud assumes to call registered services, and provides the service registration helper for Lambda-based
|
|
17
|
+
* handlers. An appropriate trust policy will be added to this role that allows Restate to assume it from outside the
|
|
18
|
+
* deployment AWS account.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RestateCloudEnvironment extends Construct implements RestateEnvironment {
|
|
21
|
+
readonly invokerRole: iam.Role;
|
|
22
|
+
readonly ingressUrl: string;
|
|
23
|
+
readonly adminUrl: string;
|
|
24
|
+
readonly authToken: ssm.ISecret;
|
|
25
|
+
readonly registrationProviderToken: cdk.CfnOutput;
|
|
26
|
+
constructor(scope: Construct, id: string, props: RestateCloudEnvironmentProps);
|
|
27
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
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.RestateCloudEnvironment = 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_ADMIN_PORT = 9070;
|
|
44
|
+
/**
|
|
45
|
+
* Restate environment hosted on Restate Cloud. This construct manages the role in the deployment environment that
|
|
46
|
+
* Restate Cloud assumes to call registered services, and provides the service registration helper for Lambda-based
|
|
47
|
+
* handlers. An appropriate trust policy will be added to this role that allows Restate to assume it from outside the
|
|
48
|
+
* deployment AWS account.
|
|
49
|
+
*/
|
|
50
|
+
class RestateCloudEnvironment extends constructs_1.Construct {
|
|
51
|
+
constructor(scope, id, props) {
|
|
52
|
+
super(scope, id);
|
|
53
|
+
// This role should be easier to customize or override completely: https://github.com/restatedev/cdk/issues/21
|
|
54
|
+
this.invokerRole = new iam.Role(this, "RestateServiceInvokerRole", {
|
|
55
|
+
description: "Role assumed by Restate Cloud when invoking Lambda service handlers",
|
|
56
|
+
assumedBy: new iam.ArnPrincipal("arn:aws:iam::663487780041:role/restate-dev"),
|
|
57
|
+
externalIds: [props.clusterId],
|
|
58
|
+
});
|
|
59
|
+
this.ingressUrl = `https://${props.clusterId}.dev.restate.cloud:${RESTATE_INGRESS_PORT}`;
|
|
60
|
+
this.adminUrl = `https://${props.clusterId}.dev.restate.cloud:${RESTATE_ADMIN_PORT}`;
|
|
61
|
+
this.authToken = ssm.Secret.fromSecretCompleteArn(this, "ClusterAuthToken", props.authTokenSecretArn);
|
|
62
|
+
const registrationProvider = new registration_provider_1.RegistrationProvider(this, "RegistrationProvider", { authToken: this.authToken });
|
|
63
|
+
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
64
|
+
description: "Restate service registration provider custom component token used by registry to perform discovery",
|
|
65
|
+
exportName: [props.prefix, "RegistrationProviderToken"].filter(Boolean).join("-"),
|
|
66
|
+
value: registrationProvider.serviceToken,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.RestateCloudEnvironment = RestateCloudEnvironment;
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1jbG91ZC1lbnZpcm9ubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1jbG91ZC1lbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDJDQUF1QztBQUN2QyxpREFBbUM7QUFDbkMseURBQTJDO0FBQzNDLG9FQUFzRDtBQUV0RCxtRUFBK0Q7QUFFL0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFhaEM7Ozs7O0dBS0c7QUFDSCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBT3BELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBbUM7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQiw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ2pFLFdBQVcsRUFBRSxxRUFBcUU7WUFDbEYsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyw0Q0FBNEMsQ0FBQztZQUM3RSxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQy9CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxLQUFLLENBQUMsU0FBUyxzQkFBc0Isb0JBQW9CLEVBQUUsQ0FBQztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsS0FBSyxDQUFDLFNBQVMsc0JBQXNCLGtCQUFrQixFQUFFLENBQUM7UUFDckYsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV0RyxNQUFNLG9CQUFvQixHQUFHLElBQUksNENBQW9CLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ3BGLFdBQVcsRUFBRSxvR0FBb0c7WUFDakgsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2pGLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxZQUFZO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVCRCwwREE0QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IFJlc3RhdGVFbnZpcm9ubWVudCB9IGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvblByb3ZpZGVyIH0gZnJvbSBcIi4vcmVnaXN0cmF0aW9uLXByb3ZpZGVyXCI7XG5cbmNvbnN0IFJFU1RBVEVfSU5HUkVTU19QT1JUID0gODA4MDtcbmNvbnN0IFJFU1RBVEVfQURNSU5fUE9SVCA9IDkwNzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdGF0ZUNsb3VkRW52aXJvbm1lbnRQcm9wcyB7XG4gIC8qKiBQcmVmaXggZm9yIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXMgY29uc3RydWN0IHRoYXQgcmVxdWlyZSB1bmlxdWUgbmFtZXMuICovXG4gIHByZWZpeD86IHN0cmluZztcblxuICAvKiogSUQgb2YgdGhlIFJlc3RhdGUgc2VydmljZSBjbHVzdGVyIHRvIHdoaWNoIHRoaXMgc2VydmljZSB3aWxsIGJlIHJlZ2lzdGVyZWQuICovXG4gIGNsdXN0ZXJJZDogc3RyaW5nO1xuXG4gIC8qKiBBdXRoIHRva2VuIGZvciBSZXN0YXRlIGVudmlyb25tZW50LiBVc2VkIHdpdGggdGhlIGFkbWluIHNlcnZpY2UgZm9yIHNlcnZpY2UgZGVwbG95bWVudCByZWdpc3RyYXRpb24uICovXG4gIGF1dGhUb2tlblNlY3JldEFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3RhdGUgZW52aXJvbm1lbnQgaG9zdGVkIG9uIFJlc3RhdGUgQ2xvdWQuIFRoaXMgY29uc3RydWN0IG1hbmFnZXMgdGhlIHJvbGUgaW4gdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgdGhhdFxuICogUmVzdGF0ZSBDbG91ZCBhc3N1bWVzIHRvIGNhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcywgYW5kIHByb3ZpZGVzIHRoZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBoZWxwZXIgZm9yIExhbWJkYS1iYXNlZFxuICogaGFuZGxlcnMuIEFuIGFwcHJvcHJpYXRlIHRydXN0IHBvbGljeSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgcm9sZSB0aGF0IGFsbG93cyBSZXN0YXRlIHRvIGFzc3VtZSBpdCBmcm9tIG91dHNpZGUgdGhlXG4gKiBkZXBsb3ltZW50IEFXUyBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgUmVzdGF0ZUNsb3VkRW52aXJvbm1lbnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBSZXN0YXRlRW52aXJvbm1lbnQge1xuICByZWFkb25seSBpbnZva2VyUm9sZTogaWFtLlJvbGU7XG4gIHJlYWRvbmx5IGluZ3Jlc3NVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgYWRtaW5Vcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0aFRva2VuOiBzc20uSVNlY3JldDtcbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUNsb3VkRW52aXJvbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBUaGlzIHJvbGUgc2hvdWxkIGJlIGVhc2llciB0byBjdXN0b21pemUgb3Igb3ZlcnJpZGUgY29tcGxldGVseTogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvY2RrL2lzc3Vlcy8yMVxuICAgIHRoaXMuaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJSZXN0YXRlU2VydmljZUludm9rZXJSb2xlXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJvbGUgYXNzdW1lZCBieSBSZXN0YXRlIENsb3VkIHdoZW4gaW52b2tpbmcgTGFtYmRhIHNlcnZpY2UgaGFuZGxlcnNcIixcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5Bcm5QcmluY2lwYWwoXCJhcm46YXdzOmlhbTo6NjYzNDg3NzgwMDQxOnJvbGUvcmVzdGF0ZS1kZXZcIiksXG4gICAgICBleHRlcm5hbElkczogW3Byb3BzLmNsdXN0ZXJJZF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmluZ3Jlc3NVcmwgPSBgaHR0cHM6Ly8ke3Byb3BzLmNsdXN0ZXJJZH0uZGV2LnJlc3RhdGUuY2xvdWQ6JHtSRVNUQVRFX0lOR1JFU1NfUE9SVH1gO1xuICAgIHRoaXMuYWRtaW5VcmwgPSBgaHR0cHM6Ly8ke3Byb3BzLmNsdXN0ZXJJZH0uZGV2LnJlc3RhdGUuY2xvdWQ6JHtSRVNUQVRFX0FETUlOX1BPUlR9YDtcbiAgICB0aGlzLmF1dGhUb2tlbiA9IHNzbS5TZWNyZXQuZnJvbVNlY3JldENvbXBsZXRlQXJuKHRoaXMsIFwiQ2x1c3RlckF1dGhUb2tlblwiLCBwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4pO1xuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uUHJvdmlkZXIgPSBuZXcgUmVnaXN0cmF0aW9uUHJvdmlkZXIodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclwiLCB7IGF1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4gfSk7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gbmV3IGNkay5DZm5PdXRwdXQodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gcHJvdmlkZXIgY3VzdG9tIGNvbXBvbmVudCB0b2tlbiB1c2VkIGJ5IHJlZ2lzdHJ5IHRvIHBlcmZvcm0gZGlzY292ZXJ5XCIsXG4gICAgICBleHBvcnROYW1lOiBbcHJvcHMucHJlZml4LCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW5cIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCItXCIpLFxuICAgICAgdmFsdWU6IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcbiAgfVxufSJdfQ==
|
|
@@ -2,12 +2,12 @@ import * as iam from "aws-cdk-lib/aws-iam";
|
|
|
2
2
|
import * as cdk from "aws-cdk-lib";
|
|
3
3
|
import * as ssm from "aws-cdk-lib/aws-secretsmanager";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* A Restate environment is a distinct deployment target. These could be an isolated environment in Restate Cloud, or
|
|
6
|
+
* a self-hosted deployment.
|
|
7
7
|
*/
|
|
8
|
-
export interface
|
|
8
|
+
export interface RestateEnvironment {
|
|
9
9
|
readonly invokerRole: iam.IRole;
|
|
10
|
-
readonly
|
|
10
|
+
readonly adminUrl: string;
|
|
11
11
|
readonly authToken?: ssm.ISecret;
|
|
12
12
|
readonly registrationProviderToken: cdk.CfnOutput;
|
|
13
13
|
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1lbnZpcm9ubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1lbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuXG4vKipcbiAqIEEgUmVzdGF0ZSBlbnZpcm9ubWVudCBpcyBhIGRpc3RpbmN0IGRlcGxveW1lbnQgdGFyZ2V0LiBUaGVzZSBjb3VsZCBiZSBhbiBpc29sYXRlZCBlbnZpcm9ubWVudCBpbiBSZXN0YXRlIENsb3VkLCBvclxuICogYSBzZWxmLWhvc3RlZCBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVFbnZpcm9ubWVudCB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IGFkbWluVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dGhUb2tlbj86IHNzbS5JU2VjcmV0O1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlclRva2VuOiBjZGsuQ2ZuT3V0cHV0O1xufSJdfQ==
|
|
@@ -3,7 +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 {
|
|
6
|
+
import { RestateEnvironment } from "./restate-environment";
|
|
7
7
|
export declare enum TracingMode {
|
|
8
8
|
DISABLED = "DISABLED",
|
|
9
9
|
AWS_XRAY = "AWS_XRAY"
|
|
@@ -15,6 +15,8 @@ export interface RestateInstanceProps {
|
|
|
15
15
|
tracing?: TracingMode;
|
|
16
16
|
/** Prefix for resources created by this construct that require unique names. */
|
|
17
17
|
prefix?: string;
|
|
18
|
+
/** Restate Docker image name. Defaults to `latest`. */
|
|
19
|
+
restateImage?: string;
|
|
18
20
|
/** Restate Docker image tag. Defaults to `latest`. */
|
|
19
21
|
restateTag?: string;
|
|
20
22
|
/** Amazon Distro for Open Telemetry Docker image tag. Defaults to `latest`. */
|
|
@@ -26,12 +28,12 @@ export interface RestateInstanceProps {
|
|
|
26
28
|
* in a dedicated VPC (unless one is provided). EC2 instance will be allocated
|
|
27
29
|
* a public IP address.
|
|
28
30
|
*/
|
|
29
|
-
export declare class
|
|
31
|
+
export declare class SingleNodeRestateDeployment extends Construct implements RestateEnvironment {
|
|
30
32
|
readonly instance: ec2.Instance;
|
|
31
33
|
readonly invokerRole: iam.IRole;
|
|
32
34
|
readonly vpc: ec2.Vpc;
|
|
33
|
-
readonly
|
|
34
|
-
readonly
|
|
35
|
+
readonly ingressUrl: string;
|
|
36
|
+
readonly adminUrl: string;
|
|
35
37
|
readonly registrationProviderToken: cdk.CfnOutput;
|
|
36
38
|
constructor(scope: Construct, id: string, props: RestateInstanceProps);
|
|
37
39
|
}
|
|
@@ -0,0 +1,165 @@
|
|
|
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.SingleNodeRestateDeployment = exports.TracingMode = void 0;
|
|
37
|
+
const constructs_1 = require("constructs");
|
|
38
|
+
const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
|
|
39
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
40
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
41
|
+
const registration_provider_1 = require("./registration-provider");
|
|
42
|
+
const PUBLIC_INGRESS_PORT = 443;
|
|
43
|
+
const PUBLIC_ADMIN_PORT = 9073;
|
|
44
|
+
const RESTATE_INGRESS_PORT = 8080;
|
|
45
|
+
const RESTATE_ADMIN_PORT = 9070;
|
|
46
|
+
const RESTATE_IMAGE_DEFAULT = "docker.io/restatedev/restate";
|
|
47
|
+
const RESTATE_DOCKER_DEFAULT_TAG = "latest";
|
|
48
|
+
const ADOT_DOCKER_DEFAULT_TAG = "latest";
|
|
49
|
+
var TracingMode;
|
|
50
|
+
(function (TracingMode) {
|
|
51
|
+
TracingMode["DISABLED"] = "DISABLED";
|
|
52
|
+
TracingMode["AWS_XRAY"] = "AWS_XRAY";
|
|
53
|
+
})(TracingMode || (exports.TracingMode = TracingMode = {}));
|
|
54
|
+
/**
|
|
55
|
+
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
56
|
+
* suitable for development and testing purposes. The instance will be created
|
|
57
|
+
* in a dedicated VPC (unless one is provided). EC2 instance will be allocated
|
|
58
|
+
* a public IP address.
|
|
59
|
+
*/
|
|
60
|
+
class SingleNodeRestateDeployment extends constructs_1.Construct {
|
|
61
|
+
constructor(scope, id, props) {
|
|
62
|
+
super(scope, id);
|
|
63
|
+
this.vpc = new ec2.Vpc(this, "Vpc", {
|
|
64
|
+
maxAzs: 3,
|
|
65
|
+
createInternetGateway: true,
|
|
66
|
+
natGateways: 0,
|
|
67
|
+
});
|
|
68
|
+
this.invokerRole = new iam.Role(this, "InstanceRole", {
|
|
69
|
+
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
|
|
70
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")],
|
|
71
|
+
});
|
|
72
|
+
props.logGroup.grantWrite(this.invokerRole);
|
|
73
|
+
const restateImage = props.restateImage ?? RESTATE_IMAGE_DEFAULT;
|
|
74
|
+
const restateTag = props.restateTag ?? RESTATE_DOCKER_DEFAULT_TAG;
|
|
75
|
+
const adotTag = props.adotTag ?? ADOT_DOCKER_DEFAULT_TAG;
|
|
76
|
+
const restateInitCommands = ec2.UserData.forLinux();
|
|
77
|
+
restateInitCommands.addCommands("yum update -y", "yum install -y docker nginx", "systemctl enable docker.service", "systemctl start docker.service", [
|
|
78
|
+
"docker run --name adot --restart unless-stopped --detach",
|
|
79
|
+
" -p 4317:4317 -p 55680:55680 -p 8889:8888",
|
|
80
|
+
` public.ecr.aws/aws-observability/aws-otel-collector:${adotTag}`,
|
|
81
|
+
].join(""), [
|
|
82
|
+
"docker run --name restate --restart unless-stopped --detach",
|
|
83
|
+
" --volume /var/restate:/target --network=host",
|
|
84
|
+
" -e RESTATE_OBSERVABILITY__LOG__FORMAT=Json -e RUST_LOG=info,restate_worker::partition=warn",
|
|
85
|
+
" -e RESTATE_OBSERVABILITY__TRACING__ENDPOINT=http://localhost:4317",
|
|
86
|
+
` --log-driver=awslogs --log-opt awslogs-group=${props.logGroup.logGroupName}`,
|
|
87
|
+
` ${restateImage}:${restateTag}`,
|
|
88
|
+
].join(""), "mkdir -p /etc/pki/private", [
|
|
89
|
+
"openssl req -new -x509 -nodes -sha256 -days 365 -extensions v3_ca",
|
|
90
|
+
" -subj '/C=DE/ST=Berlin/L=Berlin/O=restate.dev/OU=demo/CN=restate.example.com'",
|
|
91
|
+
" -newkey rsa:2048 -keyout /etc/pki/private/restate-selfsigned.key -out /etc/pki/private/restate-selfsigned.crt",
|
|
92
|
+
].join(""), ["cat << EOF > /etc/nginx/conf.d/restate-ingress.conf", NGINX_REVERSE_PROXY_CONFIG, "EOF"].join("\n"), "systemctl enable nginx", "systemctl start nginx");
|
|
93
|
+
const restateInstance = new ec2.Instance(this, "Host", {
|
|
94
|
+
vpc: this.vpc,
|
|
95
|
+
vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
|
|
96
|
+
instanceType: new ec2.InstanceType("t4g.micro"),
|
|
97
|
+
machineImage: ec2.MachineImage.latestAmazonLinux2023({
|
|
98
|
+
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
|
|
99
|
+
}),
|
|
100
|
+
role: this.invokerRole,
|
|
101
|
+
userData: restateInitCommands,
|
|
102
|
+
});
|
|
103
|
+
this.instance = restateInstance;
|
|
104
|
+
// We start the ADOT collector regardless, and only control whether they will be published to X-Ray via instance
|
|
105
|
+
// role permissions. This way historic traces will be buffered on the host, even if tracing is disabled initially.
|
|
106
|
+
if (props.tracing === TracingMode.AWS_XRAY) {
|
|
107
|
+
restateInstance.role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("AWSXrayWriteOnlyAccess"));
|
|
108
|
+
}
|
|
109
|
+
const restateInstanceSecurityGroup = new ec2.SecurityGroup(this, "RestateSecurityGroup", {
|
|
110
|
+
vpc: this.vpc,
|
|
111
|
+
securityGroupName: "RestateSecurityGroup",
|
|
112
|
+
description: "Restate service ACLs",
|
|
113
|
+
});
|
|
114
|
+
restateInstance.addSecurityGroup(restateInstanceSecurityGroup);
|
|
115
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(443), "Allow traffic from anywhere to Restate ingress port");
|
|
116
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(9073), "Allow traffic from anywhere to Restate admin port");
|
|
117
|
+
const registrationProvider = new registration_provider_1.RegistrationProvider(this, "RegistrationProvider", {});
|
|
118
|
+
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
119
|
+
description: "Custom resource provider service token, needed by the Restate service registry component to trigger discovery",
|
|
120
|
+
exportName: [props.prefix, "RegistrationProviderToken"].join("-"),
|
|
121
|
+
value: registrationProvider.serviceToken,
|
|
122
|
+
});
|
|
123
|
+
this.ingressUrl = `https://${restateInstance.instancePublicDnsName}${PUBLIC_INGRESS_PORT == 443 ? "" : `:${PUBLIC_INGRESS_PORT}`}`;
|
|
124
|
+
this.adminUrl = `https://${restateInstance.instancePublicDnsName}:${PUBLIC_ADMIN_PORT}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.SingleNodeRestateDeployment = SingleNodeRestateDeployment;
|
|
128
|
+
const NGINX_REVERSE_PROXY_CONFIG = [
|
|
129
|
+
"server {",
|
|
130
|
+
" listen 443 ssl http2;",
|
|
131
|
+
" listen [::]:443 ssl http2;",
|
|
132
|
+
" server_name _;",
|
|
133
|
+
" root /usr/share/nginx/html;",
|
|
134
|
+
"",
|
|
135
|
+
' ssl_certificate "/etc/pki/private/restate-selfsigned.crt";',
|
|
136
|
+
' ssl_certificate_key "/etc/pki/private/restate-selfsigned.key";',
|
|
137
|
+
" ssl_session_cache shared:SSL:1m;",
|
|
138
|
+
" ssl_session_timeout 10m;",
|
|
139
|
+
" ssl_ciphers PROFILE=SYSTEM;",
|
|
140
|
+
" ssl_prefer_server_ciphers on;",
|
|
141
|
+
"",
|
|
142
|
+
" location / {",
|
|
143
|
+
` proxy_pass http://localhost:${RESTATE_INGRESS_PORT};`,
|
|
144
|
+
" }",
|
|
145
|
+
"}",
|
|
146
|
+
"",
|
|
147
|
+
"server {",
|
|
148
|
+
" listen 9073 ssl http2;",
|
|
149
|
+
" listen [::]:9073 ssl http2;",
|
|
150
|
+
" server_name _;",
|
|
151
|
+
" root /usr/share/nginx/html;",
|
|
152
|
+
"",
|
|
153
|
+
' ssl_certificate "/etc/pki/private/restate-selfsigned.crt";',
|
|
154
|
+
' ssl_certificate_key "/etc/pki/private/restate-selfsigned.key";',
|
|
155
|
+
" ssl_session_cache shared:SSL:1m;",
|
|
156
|
+
" ssl_session_timeout 10m;",
|
|
157
|
+
" ssl_ciphers PROFILE=SYSTEM;",
|
|
158
|
+
" ssl_prefer_server_ciphers on;",
|
|
159
|
+
"",
|
|
160
|
+
" location / {",
|
|
161
|
+
` proxy_pass http://localhost:${RESTATE_ADMIN_PORT};`,
|
|
162
|
+
" }",
|
|
163
|
+
"}",
|
|
164
|
+
].join("\n");
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW5vZGUtcmVzdGF0ZS1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9zaW5nbGUtbm9kZS1yZXN0YXRlLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwyQ0FBdUM7QUFFdkMseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyxpREFBbUM7QUFFbkMsbUVBQStEO0FBRS9ELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQy9CLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsOEJBQThCLENBQUM7QUFDN0QsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUM7QUFDNUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUFFekMsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEI7QUFzQkQ7Ozs7O0dBS0c7QUFDSCxNQUFhLDJCQUE0QixTQUFRLHNCQUFTO0lBU3hELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxDQUFDO1lBQ1QscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FB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O0lBQ2xFLG9DQUFvQztJQUNwQyw0QkFBNEI7SUFDNUIsK0JBQStCO0lBQy9CLGlDQUFpQztJQUNqQyxFQUFFO0lBQ0YsZ0JBQWdCO0lBQ2hCLG1DQUFtQyxvQkFBb0IsR0FBRztJQUMxRCxLQUFLO0lBQ0wsR0FBRztJQUNILEVBQUU7SUFDRixVQUFVO0lBQ1YsMEJBQTBCO0lBQzFCLCtCQUErQjtJQUMvQixrQkFBa0I7SUFDbEIsK0JBQStCO0lBQy9CLEVBQUU7SUFDRiw4REFBOEQ7SUFDOUQsa0VBQWtFO0lBQ2xFLG9DQUFvQztJQUNwQyw0QkFBNEI7SUFDNUIsK0JBQStCO0lBQy9CLGlDQUFpQztJQUNqQyxFQUFFO0lBQ0YsZ0JBQWdCO0lBQ2hCLG1DQUFtQyxrQkFBa0IsR0FBRztJQUN4RCxLQUFLO0lBQ0wsR0FBRztDQUNKLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFJlc3RhdGVFbnZpcm9ubWVudCB9IGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvblByb3ZpZGVyIH0gZnJvbSBcIi4vcmVnaXN0cmF0aW9uLXByb3ZpZGVyXCI7XG5cbmNvbnN0IFBVQkxJQ19JTkdSRVNTX1BPUlQgPSA0NDM7XG5jb25zdCBQVUJMSUNfQURNSU5fUE9SVCA9IDkwNzM7XG5jb25zdCBSRVNUQVRFX0lOR1JFU1NfUE9SVCA9IDgwODA7XG5jb25zdCBSRVNUQVRFX0FETUlOX1BPUlQgPSA5MDcwO1xuY29uc3QgUkVTVEFURV9JTUFHRV9ERUZBVUxUID0gXCJkb2NrZXIuaW8vcmVzdGF0ZWRldi9yZXN0YXRlXCI7XG5jb25zdCBSRVNUQVRFX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5jb25zdCBBRE9UX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5cbmV4cG9ydCBlbnVtIFRyYWNpbmdNb2RlIHtcbiAgRElTQUJMRUQgPSBcIkRJU0FCTEVEXCIsXG4gIEFXU19YUkFZID0gXCJBV1NfWFJBWVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVJbnN0YW5jZVByb3BzIHtcbiAgLyoqIExvZyBncm91cCBmb3IgUmVzdGF0ZSBzZXJ2aWNlIGxvZ3MuICovXG4gIGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwO1xuXG4gIC8qKiBUcmFjaW5nIG1vZGUgZm9yIFJlc3RhdGUgc2VydmljZXMuIERlZmF1bHRzIHRvIHtAbGluayBUcmFjaW5nTW9kZS5ESVNBQkxFRH0uICovXG4gIHRyYWNpbmc/OiBUcmFjaW5nTW9kZTtcblxuICAvKiogUHJlZml4IGZvciByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdCB0aGF0IHJlcXVpcmUgdW5pcXVlIG5hbWVzLiAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqIFJlc3RhdGUgRG9ja2VyIGltYWdlIG5hbWUuIERlZmF1bHRzIHRvIGBsYXRlc3RgLiAqL1xuICByZXN0YXRlSW1hZ2U/OiBzdHJpbmc7XG5cbiAgLyoqIFJlc3RhdGUgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIHJlc3RhdGVUYWc/OiBzdHJpbmc7XG5cbiAgLyoqIEFtYXpvbiBEaXN0cm8gZm9yIE9wZW4gVGVsZW1ldHJ5IERvY2tlciBpbWFnZSB0YWcuIERlZmF1bHRzIHRvIGBsYXRlc3RgLiAqL1xuICBhZG90VGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBiYWNrZWQgYnkgYSBzaW5nbGUgRUMyIGluc3RhbmNlLFxuICogc3VpdGFibGUgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzLiBUaGUgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkXG4gKiBpbiBhIGRlZGljYXRlZCBWUEMgKHVubGVzcyBvbmUgaXMgcHJvdmlkZWQpLiBFQzIgaW5zdGFuY2Ugd2lsbCBiZSBhbGxvY2F0ZWRcbiAqIGEgcHVibGljIElQIGFkZHJlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVOb2RlUmVzdGF0ZURlcGxveW1lbnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBSZXN0YXRlRW52aXJvbm1lbnQge1xuICByZWFkb25seSBpbnN0YW5jZTogZWMyLkluc3RhbmNlO1xuICByZWFkb25seSBpbnZva2VyUm9sZTogaWFtLklSb2xlO1xuICByZWFkb25seSB2cGM6IGVjMi5WcGM7XG5cbiAgcmVhZG9ubHkgaW5ncmVzc1VybDogc3RyaW5nO1xuICByZWFkb25seSBhZG1pblVybDogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlclRva2VuOiBjZGsuQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZXN0YXRlSW5zdGFuY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnZwYyA9IG5ldyBlYzIuVnBjKHRoaXMsIFwiVnBjXCIsIHtcbiAgICAgIG1heEF6czogMyxcbiAgICAgIGNyZWF0ZUludGVybmV0R2F0ZXdheTogdHJ1ZSxcbiAgICAgIG5hdEdhdGV3YXlzOiAwLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnZva2VyUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIkluc3RhbmNlUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImVjMi5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQW1hem9uU1NNTWFuYWdlZEluc3RhbmNlQ29yZVwiKV0sXG4gICAgfSk7XG4gICAgcHJvcHMubG9nR3JvdXAuZ3JhbnRXcml0ZSh0aGlzLmludm9rZXJSb2xlKTtcblxuICAgIGNvbnN0IHJlc3RhdGVJbWFnZSA9IHByb3BzLnJlc3RhdGVJbWFnZSA/PyBSRVNUQVRFX0lNQUdFX0RFRkFVTFQ7XG4gICAgY29uc3QgcmVzdGF0ZVRhZyA9IHByb3BzLnJlc3RhdGVUYWcgPz8gUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUc7XG4gICAgY29uc3QgYWRvdFRhZyA9IHByb3BzLmFkb3RUYWcgPz8gQURPVF9ET0NLRVJfREVGQVVMVF9UQUc7XG4gICAgY29uc3QgcmVzdGF0ZUluaXRDb21tYW5kcyA9IGVjMi5Vc2VyRGF0YS5mb3JMaW51eCgpO1xuICAgIHJlc3RhdGVJbml0Q29tbWFuZHMuYWRkQ29tbWFuZHMoXG4gICAgICBcInl1bSB1cGRhdGUgLXlcIixcbiAgICAgIFwieXVtIGluc3RhbGwgLXkgZG9ja2VyIG5naW54XCIsXG5cbiAgICAgIFwic3lzdGVtY3RsIGVuYWJsZSBkb2NrZXIuc2VydmljZVwiLFxuICAgICAgXCJzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgIFtcbiAgICAgICAgXCJkb2NrZXIgcnVuIC0tbmFtZSBhZG90IC0tcmVzdGFydCB1bmxlc3Mtc3RvcHBlZCAtLWRldGFjaFwiLFxuICAgICAgICBcIiAtcCA0MzE3OjQzMTcgLXAgNTU2ODA6NTU2ODAgLXAgODg4OTo4ODg4XCIsXG4gICAgICAgIGAgcHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLW90ZWwtY29sbGVjdG9yOiR7YWRvdFRhZ31gLFxuICAgICAgXS5qb2luKFwiXCIpLFxuICAgICAgW1xuICAgICAgICBcImRvY2tlciBydW4gLS1uYW1lIHJlc3RhdGUgLS1yZXN0YXJ0IHVubGVzcy1zdG9wcGVkIC0tZGV0YWNoXCIsXG4gICAgICAgIFwiIC0tdm9sdW1lIC92YXIvcmVzdGF0ZTovdGFyZ2V0IC0tbmV0d29yaz1ob3N0XCIsXG4gICAgICAgIFwiIC1lIFJFU1RBVEVfT0JTRVJWQUJJTElUWV9fTE9HX19GT1JNQVQ9SnNvbiAtZSBSVVNUX0xPRz1pbmZvLHJlc3RhdGVfd29ya2VyOjpwYXJ0aXRpb249d2FyblwiLFxuICAgICAgICBcIiAtZSBSRVNUQVRFX09CU0VSVkFCSUxJVFlfX1RSQUNJTkdfX0VORFBPSU5UPWh0dHA6Ly9sb2NhbGhvc3Q6NDMxN1wiLFxuICAgICAgICBgIC0tbG9nLWRyaXZlcj1hd3Nsb2dzIC0tbG9nLW9wdCBhd3Nsb2dzLWdyb3VwPSR7cHJvcHMubG9nR3JvdXAubG9nR3JvdXBOYW1lfWAsXG4gICAgICAgIGAgJHtyZXN0YXRlSW1hZ2V9OiR7cmVzdGF0ZVRhZ31gLFxuICAgICAgXS5qb2luKFwiXCIpLFxuXG4gICAgICBcIm1rZGlyIC1wIC9ldGMvcGtpL3ByaXZhdGVcIixcbiAgICAgIFtcbiAgICAgICAgXCJvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAtc2hhMjU2IC1kYXlzIDM2NSAtZXh0ZW5zaW9ucyB2M19jYVwiLFxuICAgICAgICBcIiAtc3ViaiAnL0M9REUvU1Q9QmVybGluL0w9QmVybGluL089cmVzdGF0ZS5kZXYvT1U9ZGVtby9DTj1yZXN0YXRlLmV4YW1wbGUuY29tJ1wiLFxuICAgICAgICBcIiAtbmV3a2V5IHJzYToyMDQ4IC1rZXlvdXQgL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQua2V5IC1vdXQgL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQuY3J0XCIsXG4gICAgICBdLmpvaW4oXCJcIiksXG4gICAgICBbXCJjYXQgPDwgRU9GID4gL2V0Yy9uZ2lueC9jb25mLmQvcmVzdGF0ZS1pbmdyZXNzLmNvbmZcIiwgTkdJTlhfUkVWRVJTRV9QUk9YWV9DT05GSUcsIFwiRU9GXCJdLmpvaW4oXCJcXG5cIiksXG4gICAgICBcInN5c3RlbWN0bCBlbmFibGUgbmdpbnhcIixcbiAgICAgIFwic3lzdGVtY3RsIHN0YXJ0IG5naW54XCIsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3RhdGVJbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgXCJIb3N0XCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyB9LFxuICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgZWMyLkluc3RhbmNlVHlwZShcInQ0Zy5taWNyb1wiKSxcbiAgICAgIG1hY2hpbmVJbWFnZTogZWMyLk1hY2hpbmVJbWFnZS5sYXRlc3RBbWF6b25MaW51eDIwMjMoe1xuICAgICAgICBjcHVUeXBlOiBlYzIuQW1hem9uTGludXhDcHVUeXBlLkFSTV82NCxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogdGhpcy5pbnZva2VyUm9sZSxcbiAgICAgIHVzZXJEYXRhOiByZXN0YXRlSW5pdENvbW1hbmRzLFxuICAgIH0pO1xuICAgIHRoaXMuaW5zdGFuY2UgPSByZXN0YXRlSW5zdGFuY2U7XG5cbiAgICAvLyBXZSBzdGFydCB0aGUgQURPVCBjb2xsZWN0b3IgcmVnYXJkbGVzcywgYW5kIG9ubHkgY29udHJvbCB3aGV0aGVyIHRoZXkgd2lsbCBiZSBwdWJsaXNoZWQgdG8gWC1SYXkgdmlhIGluc3RhbmNlXG4gICAgLy8gcm9sZSBwZXJtaXNzaW9ucy4gVGhpcyB3YXkgaGlzdG9yaWMgdHJhY2VzIHdpbGwgYmUgYnVmZmVyZWQgb24gdGhlIGhvc3QsIGV2ZW4gaWYgdHJhY2luZyBpcyBkaXNhYmxlZCBpbml0aWFsbHkuXG4gICAgaWYgKHByb3BzLnRyYWNpbmcgPT09IFRyYWNpbmdNb2RlLkFXU19YUkFZKSB7XG4gICAgICByZXN0YXRlSW5zdGFuY2Uucm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU1hyYXlXcml0ZU9ubHlBY2Nlc3NcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3RhdGVJbnN0YW5jZVNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgXCJSZXN0YXRlU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IFwiUmVzdGF0ZVNlY3VyaXR5R3JvdXBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlc3RhdGUgc2VydmljZSBBQ0xzXCIsXG4gICAgfSk7XG4gICAgcmVzdGF0ZUluc3RhbmNlLmFkZFNlY3VyaXR5R3JvdXAocmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cCk7XG5cbiAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgZWMyLlBlZXIuYW55SXB2NCgpLFxuICAgICAgZWMyLlBvcnQudGNwKDQ0MyksXG4gICAgICBcIkFsbG93IHRyYWZmaWMgZnJvbSBhbnl3aGVyZSB0byBSZXN0YXRlIGluZ3Jlc3MgcG9ydFwiLFxuICAgICk7XG4gICAgcmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGVjMi5QZWVyLmFueUlwdjQoKSxcbiAgICAgIGVjMi5Qb3J0LnRjcCg5MDczKSxcbiAgICAgIFwiQWxsb3cgdHJhZmZpYyBmcm9tIGFueXdoZXJlIHRvIFJlc3RhdGUgYWRtaW4gcG9ydFwiLFxuICAgICk7XG5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Qcm92aWRlciA9IG5ldyBSZWdpc3RyYXRpb25Qcm92aWRlcih0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyXCIsIHt9KTtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW4gPSBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW5cIiwge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQ3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHNlcnZpY2UgdG9rZW4sIG5lZWRlZCBieSB0aGUgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJ5IGNvbXBvbmVudCB0byB0cmlnZ2VyIGRpc2NvdmVyeVwiLFxuICAgICAgZXhwb3J0TmFtZTogW3Byb3BzLnByZWZpeCwgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCJdLmpvaW4oXCItXCIpLFxuICAgICAgdmFsdWU6IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcblxuICAgIHRoaXMuaW5ncmVzc1VybCA9IGBodHRwczovLyR7cmVzdGF0ZUluc3RhbmNlLmluc3RhbmNlUHVibGljRG5zTmFtZX0ke1xuICAgICAgUFVCTElDX0lOR1JFU1NfUE9SVCA9PSA0NDMgPyBcIlwiIDogYDoke1BVQkxJQ19JTkdSRVNTX1BPUlR9YFxuICAgIH1gO1xuICAgIHRoaXMuYWRtaW5VcmwgPSBgaHR0cHM6Ly8ke3Jlc3RhdGVJbnN0YW5jZS5pbnN0YW5jZVB1YmxpY0Ruc05hbWV9OiR7UFVCTElDX0FETUlOX1BPUlR9YDtcbiAgfVxufVxuXG5jb25zdCBOR0lOWF9SRVZFUlNFX1BST1hZX0NPTkZJRyA9IFtcbiAgXCJzZXJ2ZXIge1wiLFxuICBcIiAgbGlzdGVuIDQ0MyBzc2wgaHR0cDI7XCIsXG4gIFwiICBsaXN0ZW4gWzo6XTo0NDMgc3NsIGh0dHAyO1wiLFxuICBcIiAgc2VydmVyX25hbWUgXztcIixcbiAgXCIgIHJvb3QgL3Vzci9zaGFyZS9uZ2lueC9odG1sO1wiLFxuICBcIlwiLFxuICAnICBzc2xfY2VydGlmaWNhdGUgXCIvZXRjL3BraS9wcml2YXRlL3Jlc3RhdGUtc2VsZnNpZ25lZC5jcnRcIjsnLFxuICAnICBzc2xfY2VydGlmaWNhdGVfa2V5IFwiL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQua2V5XCI7JyxcbiAgXCIgIHNzbF9zZXNzaW9uX2NhY2hlIHNoYXJlZDpTU0w6MW07XCIsXG4gIFwiICBzc2xfc2Vzc2lvbl90aW1lb3V0IDEwbTtcIixcbiAgXCIgIHNzbF9jaXBoZXJzIFBST0ZJTEU9U1lTVEVNO1wiLFxuICBcIiAgc3NsX3ByZWZlcl9zZXJ2ZXJfY2lwaGVycyBvbjtcIixcbiAgXCJcIixcbiAgXCIgIGxvY2F0aW9uIC8ge1wiLFxuICBgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDoke1JFU1RBVEVfSU5HUkVTU19QT1JUfTtgLFxuICBcIiAgfVwiLFxuICBcIn1cIixcbiAgXCJcIixcbiAgXCJzZXJ2ZXIge1wiLFxuICBcIiAgbGlzdGVuIDkwNzMgc3NsIGh0dHAyO1wiLFxuICBcIiAgbGlzdGVuIFs6Ol06OTA3MyBzc2wgaHR0cDI7XCIsXG4gIFwiICBzZXJ2ZXJfbmFtZSBfO1wiLFxuICBcIiAgcm9vdCAvdXNyL3NoYXJlL25naW54L2h0bWw7XCIsXG4gIFwiXCIsXG4gICcgIHNzbF9jZXJ0aWZpY2F0ZSBcIi9ldGMvcGtpL3ByaXZhdGUvcmVzdGF0ZS1zZWxmc2lnbmVkLmNydFwiOycsXG4gICcgIHNzbF9jZXJ0aWZpY2F0ZV9rZXkgXCIvZXRjL3BraS9wcml2YXRlL3Jlc3RhdGUtc2VsZnNpZ25lZC5rZXlcIjsnLFxuICBcIiAgc3NsX3Nlc3Npb25fY2FjaGUgc2hhcmVkOlNTTDoxbTtcIixcbiAgXCIgIHNzbF9zZXNzaW9uX3RpbWVvdXQgMTBtO1wiLFxuICBcIiAgc3NsX2NpcGhlcnMgUFJPRklMRT1TWVNURU07XCIsXG4gIFwiICBzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIG9uO1wiLFxuICBcIlwiLFxuICBcIiAgbG9jYXRpb24gLyB7XCIsXG4gIGAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7UkVTVEFURV9BRE1JTl9QT1JUfTtgLFxuICBcIiAgfVwiLFxuICBcIn1cIixcbl0uam9pbihcIlxcblwiKTtcbiJdfQ==
|
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.7.0",
|
|
5
5
|
"author": "Restate Developers",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"email": "code@restate.dev",
|
|
@@ -23,21 +23,21 @@
|
|
|
23
23
|
"cdk": "cdk"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@types/aws-lambda": "^8.10.
|
|
27
|
-
"@types/jest": "^29.5.
|
|
28
|
-
"@types/node": "20.
|
|
26
|
+
"@types/aws-lambda": "^8.10.131",
|
|
27
|
+
"@types/jest": "^29.5.11",
|
|
28
|
+
"@types/node": "^20.11.0",
|
|
29
29
|
"@types/source-map-support": "^0.5.10",
|
|
30
|
-
"aws-cdk": "2.
|
|
31
|
-
"esbuild": "^0.19.
|
|
30
|
+
"aws-cdk": "^2.121.1",
|
|
31
|
+
"esbuild": "^0.19.11",
|
|
32
32
|
"jest": "^29.7.0",
|
|
33
|
-
"prettier": "^3.1.
|
|
33
|
+
"prettier": "^3.1.1",
|
|
34
34
|
"ts-jest": "^29.1.1",
|
|
35
|
-
"ts-node": "^10.9.
|
|
36
|
-
"typescript": "
|
|
35
|
+
"ts-node": "^10.9.2",
|
|
36
|
+
"typescript": "^5.3.3"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@aws-sdk/client-secrets-manager": "^3.462.0",
|
|
40
|
-
"aws-cdk-lib": "^2.
|
|
40
|
+
"aws-cdk-lib": "^2.121.0",
|
|
41
41
|
"constructs": "^10.0.0",
|
|
42
42
|
"node-fetch": "^3.3.2",
|
|
43
43
|
"source-map-support": "^0.5.21"
|
|
@@ -1,27 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
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==
|
package/dist/restate-instance.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJlc3RhdGUgc2VydmljZS4gVGhpcyBjb3VsZCByZXByZXNlbnQgYSBzZWxmLWhvc3RlZCBicm9rZXIsIG9yIFJlc3RhdGUncyBtYW5hZ2VkXG4gKiBzZXJ2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBhdXRoVG9rZW4/OiBzc20uSVNlY3JldDtcbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcbn0iXX0=
|
|
@@ -1,163 +0,0 @@
|
|
|
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.SingleNodeRestateInstance = exports.TracingMode = void 0;
|
|
37
|
-
const constructs_1 = require("constructs");
|
|
38
|
-
const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
|
|
39
|
-
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
40
|
-
const cdk = __importStar(require("aws-cdk-lib"));
|
|
41
|
-
const registration_provider_1 = require("./registration-provider");
|
|
42
|
-
const PUBLIC_INGRESS_PORT = 443;
|
|
43
|
-
const PUBLIC_META_PORT = 9073;
|
|
44
|
-
const RESTATE_INGRESS_PORT = 8080;
|
|
45
|
-
const RESTATE_META_PORT = 9070;
|
|
46
|
-
const RESTATE_DOCKER_DEFAULT_TAG = "latest";
|
|
47
|
-
const ADOT_DOCKER_DEFAULT_TAG = "latest";
|
|
48
|
-
var TracingMode;
|
|
49
|
-
(function (TracingMode) {
|
|
50
|
-
TracingMode["DISABLED"] = "DISABLED";
|
|
51
|
-
TracingMode["AWS_XRAY"] = "AWS_XRAY";
|
|
52
|
-
})(TracingMode || (exports.TracingMode = TracingMode = {}));
|
|
53
|
-
/**
|
|
54
|
-
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
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.
|
|
58
|
-
*/
|
|
59
|
-
class SingleNodeRestateInstance extends constructs_1.Construct {
|
|
60
|
-
constructor(scope, id, props) {
|
|
61
|
-
super(scope, id);
|
|
62
|
-
this.vpc = new ec2.Vpc(this, "Vpc", {
|
|
63
|
-
maxAzs: 3,
|
|
64
|
-
createInternetGateway: true,
|
|
65
|
-
natGateways: 0,
|
|
66
|
-
});
|
|
67
|
-
this.invokerRole = new iam.Role(this, "InstanceRole", {
|
|
68
|
-
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
|
|
69
|
-
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")],
|
|
70
|
-
});
|
|
71
|
-
props.logGroup.grantWrite(this.invokerRole);
|
|
72
|
-
const restateTag = props.restateTag ?? RESTATE_DOCKER_DEFAULT_TAG;
|
|
73
|
-
const adotTag = props.adotTag ?? ADOT_DOCKER_DEFAULT_TAG;
|
|
74
|
-
const restateInitCommands = ec2.UserData.forLinux();
|
|
75
|
-
restateInitCommands.addCommands("yum update -y", "yum install -y docker nginx", "systemctl enable docker.service", "systemctl start docker.service", [
|
|
76
|
-
"docker run --name adot --restart unless-stopped --detach",
|
|
77
|
-
" -p 4317:4317 -p 55680:55680 -p 8889:8888",
|
|
78
|
-
` public.ecr.aws/aws-observability/aws-otel-collector:${adotTag}`,
|
|
79
|
-
].join(""), [
|
|
80
|
-
"docker run --name restate --restart unless-stopped --detach",
|
|
81
|
-
" --volume /var/restate:/target --network=host",
|
|
82
|
-
" -e RESTATE_OBSERVABILITY__LOG__FORMAT=Json -e RUST_LOG=info,restate_worker::partition=warn",
|
|
83
|
-
" -e RESTATE_OBSERVABILITY__TRACING__ENDPOINT=http://localhost:4317",
|
|
84
|
-
` --log-driver=awslogs --log-opt awslogs-group=${props.logGroup.logGroupName}`,
|
|
85
|
-
` docker.io/restatedev/restate:${restateTag}`,
|
|
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");
|
|
91
|
-
const restateInstance = new ec2.Instance(this, "Host", {
|
|
92
|
-
vpc: this.vpc,
|
|
93
|
-
vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
|
|
94
|
-
instanceType: new ec2.InstanceType("t4g.micro"),
|
|
95
|
-
machineImage: ec2.MachineImage.latestAmazonLinux2023({
|
|
96
|
-
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
|
|
97
|
-
}),
|
|
98
|
-
role: this.invokerRole,
|
|
99
|
-
userData: restateInitCommands,
|
|
100
|
-
});
|
|
101
|
-
this.instance = restateInstance;
|
|
102
|
-
// We start the ADOT collector regardless, and only control whether they will be published to X-Ray via instance
|
|
103
|
-
// role permissions. This way historic traces will be buffered on the host, even if tracing is disabled initially.
|
|
104
|
-
if (props.tracing === TracingMode.AWS_XRAY) {
|
|
105
|
-
restateInstance.role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("AWSXrayWriteOnlyAccess"));
|
|
106
|
-
}
|
|
107
|
-
const restateInstanceSecurityGroup = new ec2.SecurityGroup(this, "RestateSecurityGroup", {
|
|
108
|
-
vpc: this.vpc,
|
|
109
|
-
securityGroupName: "RestateSecurityGroup",
|
|
110
|
-
description: "Restate service ACLs",
|
|
111
|
-
});
|
|
112
|
-
restateInstance.addSecurityGroup(restateInstanceSecurityGroup);
|
|
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", {});
|
|
116
|
-
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
117
|
-
description: "Custom resource provider service token, needed by the Restate service registry component to trigger discovery",
|
|
118
|
-
exportName: [props.prefix, "RegistrationProviderToken"].join("-"),
|
|
119
|
-
value: registrationProvider.serviceToken,
|
|
120
|
-
});
|
|
121
|
-
this.ingressEndpoint = `https://${restateInstance.instancePublicDnsName}${PUBLIC_INGRESS_PORT == 443 ? "" : `:${PUBLIC_INGRESS_PORT}`}`;
|
|
122
|
-
this.metaEndpoint = `https://${restateInstance.instancePublicDnsName}:${PUBLIC_META_PORT}`;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
exports.SingleNodeRestateInstance = SingleNodeRestateInstance;
|
|
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
|