@restatedev/restate-cdk 0.4.2 → 0.8.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.
@@ -1,38 +0,0 @@
1
- import * as lambda from "aws-cdk-lib/aws-lambda";
2
- import { Construct } from "constructs";
3
- import { RestateInstance } from "./restate-instance";
4
- /**
5
- * A Restate RPC service path. Example: `greeter`.
6
- */
7
- type RestatePath = string;
8
- export interface RestateInstanceRef {
9
- readonly metaEndpoint: string;
10
- readonly invokerRoleArn: string;
11
- readonly authTokenSecretArn?: string;
12
- }
13
- /**
14
- * A collection of Lambda Restate RPC Service handlers.
15
- */
16
- export type LambdaServiceRegistryProps = {
17
- /**
18
- * Mappings from service path to Lambda handler.
19
- */
20
- serviceHandlers: Record<RestatePath, lambda.Function>;
21
- /**
22
- * Custom resource provider token required for service discovery.
23
- */
24
- restate: RestateInstance;
25
- };
26
- /**
27
- * Represents a collection of Lambda-based Restate RPC services. This component is used to register
28
- * them with a single Restate instance. This creates a custom resource which will trigger service
29
- * discovery on any handler changes deployed through CDK/CloudFormation.
30
- */
31
- export declare class LambdaServiceRegistry extends Construct {
32
- private readonly serviceHandlers;
33
- private readonly registrationProviderToken;
34
- constructor(scope: Construct, id: string, props: LambdaServiceRegistryProps);
35
- register(restate: RestateInstanceRef): void;
36
- private registerHandler;
37
- }
38
- export {};
@@ -1,100 +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.LambdaServiceRegistry = void 0;
37
- const cdk = __importStar(require("aws-cdk-lib"));
38
- const iam = __importStar(require("aws-cdk-lib/aws-iam"));
39
- const constructs_1 = require("constructs");
40
- /**
41
- * Represents a collection of Lambda-based Restate RPC services. This component is used to register
42
- * them with a single Restate instance. This creates a custom resource which will trigger service
43
- * discovery on any handler changes deployed through CDK/CloudFormation.
44
- */
45
- class LambdaServiceRegistry extends constructs_1.Construct {
46
- constructor(scope, id, props) {
47
- super(scope, id);
48
- if (Object.values(props.serviceHandlers).length == 0) {
49
- throw new Error("Please specify at least one service handler.");
50
- }
51
- this.serviceHandlers = props.serviceHandlers;
52
- this.registrationProviderToken = props.restate.registrationProviderToken.value;
53
- }
54
- register(restate) {
55
- const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole", restate.invokerRoleArn);
56
- const allowInvokeFunction = new iam.Policy(this, "AllowInvokeFunction", {
57
- statements: [
58
- new iam.PolicyStatement({
59
- sid: "AllowInvokeAnyFunctionVersion",
60
- actions: ["lambda:InvokeFunction"],
61
- resources: Object.values(this.serviceHandlers)
62
- .map(handler => handler.functionArn + ":*"),
63
- }),
64
- ],
65
- });
66
- invokerRole.attachInlinePolicy(allowInvokeFunction);
67
- for (const [path, handler] of Object.entries(this.serviceHandlers)) {
68
- this.registerHandler(restate, { path, handler }, allowInvokeFunction);
69
- }
70
- }
71
- registerHandler(restate, service, allowInvokeFunction) {
72
- const registrar = new RestateServiceRegistrar(this, service.handler.node.id + "Discovery", {
73
- restate,
74
- service,
75
- serviceToken: this.registrationProviderToken,
76
- });
77
- // CloudFormation doesn't know that Restate depends on this role to call services; we must ensure that Lambda
78
- // permission changes are applied before we can trigger discovery (represented by the registrar).
79
- registrar.node.addDependency(allowInvokeFunction);
80
- }
81
- }
82
- exports.LambdaServiceRegistry = LambdaServiceRegistry;
83
- class RestateServiceRegistrar extends constructs_1.Construct {
84
- constructor(scope, id, props) {
85
- super(scope, id);
86
- new cdk.CustomResource(this, props.service.handler.node.id + "Discovery", {
87
- serviceToken: props.serviceToken,
88
- resourceType: "Custom::RestateServiceRegistrar",
89
- properties: {
90
- servicePath: props.service.path,
91
- metaEndpoint: props.restate.metaEndpoint,
92
- authTokenSecretArn: props.restate.authTokenSecretArn,
93
- serviceLambdaArn: props.service.handler.currentVersion.functionArn,
94
- invokeRoleArn: props.restate.invokerRoleArn,
95
- removalPolicy: cdk.RemovalPolicy.RETAIN,
96
- },
97
- });
98
- }
99
- }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXNlcnZpY2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsaURBQW1DO0FBQ25DLHlEQUEyQztBQUUzQywyQ0FBdUM7QUErQnZDOzs7O0dBSUc7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBSWxELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzdDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQztJQUNqRixDQUFDO0lBRU0sUUFBUSxDQUFDLE9BQTJCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUN0RSxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixHQUFHLEVBQUUsK0JBQStCO29CQUNwQyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzt5QkFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7aUJBQzlDLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXBELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUEyQixFQUFFLE9BR3BELEVBQUUsbUJBQStCO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDekYsT0FBTztZQUNQLE9BQU87WUFDUCxZQUFZLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtTQUM3QyxDQUFDLENBQUM7UUFFSCw2R0FBNkc7UUFDN0csaUdBQWlHO1FBQ2pHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBbERELHNEQWtEQztBQUVELE1BQU0sdUJBQXdCLFNBQVEsc0JBQVM7SUFDN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFDNUIsS0FPQztRQUVYLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsRUFBRTtZQUN4RSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsWUFBWSxFQUFFLGlDQUFpQztZQUMvQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDL0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWTtnQkFDeEMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7Z0JBQ3BELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXO2dCQUNsRSxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUMzQyxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO2FBQ1A7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uUHJvcGVydGllcyB9IGZyb20gXCIuL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlclwiO1xuXG5pbXBvcnQgeyBSZXN0YXRlSW5zdGFuY2UgfSBmcm9tIFwiLi9yZXN0YXRlLWluc3RhbmNlXCI7XG5cbi8qKlxuICogQSBSZXN0YXRlIFJQQyBzZXJ2aWNlIHBhdGguIEV4YW1wbGU6IGBncmVldGVyYC5cbiAqL1xudHlwZSBSZXN0YXRlUGF0aCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0YXRlSW5zdGFuY2VSZWYge1xuICByZWFkb25seSBtZXRhRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52b2tlclJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0aFRva2VuU2VjcmV0QXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBMYW1iZGEgUmVzdGF0ZSBSUEMgU2VydmljZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5ncyBmcm9tIHNlcnZpY2UgcGF0aCB0byBMYW1iZGEgaGFuZGxlci5cbiAgICovXG4gIHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgdG9rZW4gcmVxdWlyZWQgZm9yIHNlcnZpY2UgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVzdGF0ZTogUmVzdGF0ZUluc3RhbmNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIExhbWJkYS1iYXNlZCBSZXN0YXRlIFJQQyBzZXJ2aWNlcy4gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byByZWdpc3RlclxuICogdGhlbSB3aXRoIGEgc2luZ2xlIFJlc3RhdGUgaW5zdGFuY2UuIFRoaXMgY3JlYXRlcyBhIGN1c3RvbSByZXNvdXJjZSB3aGljaCB3aWxsIHRyaWdnZXIgc2VydmljZVxuICogZGlzY292ZXJ5IG9uIGFueSBoYW5kbGVyIGNoYW5nZXMgZGVwbG95ZWQgdGhyb3VnaCBDREsvQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFTZXJ2aWNlUmVnaXN0cnkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKE9iamVjdC52YWx1ZXMocHJvcHMuc2VydmljZUhhbmRsZXJzKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNlcnZpY2UgaGFuZGxlci5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2aWNlSGFuZGxlcnMgPSBwcm9wcy5zZXJ2aWNlSGFuZGxlcnM7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gcHJvcHMucmVzdGF0ZS5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKHJlc3RhdGU6IFJlc3RhdGVJbnN0YW5jZVJlZikge1xuICAgIGNvbnN0IGludm9rZXJSb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgXCJJbnZva2VyUm9sZVwiLCByZXN0YXRlLmludm9rZXJSb2xlQXJuKTtcblxuICAgIGNvbnN0IGFsbG93SW52b2tlRnVuY3Rpb24gPSBuZXcgaWFtLlBvbGljeSh0aGlzLCBcIkFsbG93SW52b2tlRnVuY3Rpb25cIiwge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgc2lkOiBcIkFsbG93SW52b2tlQW55RnVuY3Rpb25WZXJzaW9uXCIsXG4gICAgICAgICAgYWN0aW9uczogW1wibGFtYmRhOkludm9rZUZ1bmN0aW9uXCJdLFxuICAgICAgICAgIHJlc291cmNlczogT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VIYW5kbGVycylcbiAgICAgICAgICAgIC5tYXAoaGFuZGxlciA9PiBoYW5kbGVyLmZ1bmN0aW9uQXJuICsgXCI6KlwiKSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaW52b2tlclJvbGUuYXR0YWNoSW5saW5lUG9saWN5KGFsbG93SW52b2tlRnVuY3Rpb24pO1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZXJ2aWNlSGFuZGxlcnMpKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVySGFuZGxlcihyZXN0YXRlLCB7IHBhdGgsIGhhbmRsZXIgfSwgYWxsb3dJbnZva2VGdW5jdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckhhbmRsZXIocmVzdGF0ZTogUmVzdGF0ZUluc3RhbmNlUmVmLCBzZXJ2aWNlOiB7XG4gICAgcGF0aDogUmVzdGF0ZVBhdGgsXG4gICAgaGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uXG4gIH0sIGFsbG93SW52b2tlRnVuY3Rpb246IGlhbS5Qb2xpY3kpIHtcbiAgICBjb25zdCByZWdpc3RyYXIgPSBuZXcgUmVzdGF0ZVNlcnZpY2VSZWdpc3RyYXIodGhpcywgc2VydmljZS5oYW5kbGVyLm5vZGUuaWQgKyBcIkRpc2NvdmVyeVwiLCB7XG4gICAgICByZXN0YXRlLFxuICAgICAgc2VydmljZSxcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gZG9lc24ndCBrbm93IHRoYXQgUmVzdGF0ZSBkZXBlbmRzIG9uIHRoaXMgcm9sZSB0byBjYWxsIHNlcnZpY2VzOyB3ZSBtdXN0IGVuc3VyZSB0aGF0IExhbWJkYVxuICAgIC8vIHBlcm1pc3Npb24gY2hhbmdlcyBhcmUgYXBwbGllZCBiZWZvcmUgd2UgY2FuIHRyaWdnZXIgZGlzY292ZXJ5IChyZXByZXNlbnRlZCBieSB0aGUgcmVnaXN0cmFyKS5cbiAgICByZWdpc3RyYXIubm9kZS5hZGREZXBlbmRlbmN5KGFsbG93SW52b2tlRnVuY3Rpb24pO1xuICB9XG59XG5cbmNsYXNzIFJlc3RhdGVTZXJ2aWNlUmVnaXN0cmFyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICByZXN0YXRlOiBSZXN0YXRlSW5zdGFuY2VSZWYsXG4gICAgICAgICAgICAgICAgc2VydmljZToge1xuICAgICAgICAgICAgICAgICAgcGF0aDogUmVzdGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgICBoYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb25cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlcnZpY2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICB9LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCBwcm9wcy5zZXJ2aWNlLmhhbmRsZXIubm9kZS5pZCArIFwiRGlzY292ZXJ5XCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6UmVzdGF0ZVNlcnZpY2VSZWdpc3RyYXJcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2VydmljZVBhdGg6IHByb3BzLnNlcnZpY2UucGF0aCxcbiAgICAgICAgbWV0YUVuZHBvaW50OiBwcm9wcy5yZXN0YXRlLm1ldGFFbmRwb2ludCxcbiAgICAgICAgYXV0aFRva2VuU2VjcmV0QXJuOiBwcm9wcy5yZXN0YXRlLmF1dGhUb2tlblNlY3JldEFybixcbiAgICAgICAgc2VydmljZUxhbWJkYUFybjogcHJvcHMuc2VydmljZS5oYW5kbGVyLmN1cnJlbnRWZXJzaW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgICBpbnZva2VSb2xlQXJuOiBwcm9wcy5yZXN0YXRlLmludm9rZXJSb2xlQXJuLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICB9IHNhdGlzZmllcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG59Il19
@@ -1,12 +0,0 @@
1
- import { Construct } from "constructs";
2
- import * as ssm from "aws-cdk-lib/aws-secretsmanager";
3
- import * as cdk from "aws-cdk-lib";
4
- import * as ec2 from "aws-cdk-lib/aws-ec2";
5
- export declare class RegistrationProvider extends Construct {
6
- readonly serviceToken: string;
7
- constructor(scope: Construct, id: string, props: {
8
- authToken?: ssm.ISecret;
9
- timeout?: cdk.Duration;
10
- vpc?: ec2.Vpc;
11
- });
12
- }
@@ -1,77 +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
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.RegistrationProvider = void 0;
40
- const constructs_1 = require("constructs");
41
- const lambda_node = __importStar(require("aws-cdk-lib/aws-lambda-nodejs"));
42
- const node_path_1 = __importDefault(require("node:path"));
43
- const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
44
- const cdk = __importStar(require("aws-cdk-lib"));
45
- const cr = __importStar(require("aws-cdk-lib/custom-resources"));
46
- const DEFAULT_TIMEOUT = cdk.Duration.seconds(120);
47
- class RegistrationProvider extends constructs_1.Construct {
48
- constructor(scope, id, props) {
49
- super(scope, id);
50
- if (props.vpc) {
51
- console.log("Using VPC!");
52
- }
53
- const registrationHandler = new lambda_node.NodejsFunction(this, "RegistrationHandler", {
54
- description: "Restate custom registration handler",
55
- entry: node_path_1.default.join(__dirname, "register-service-handler/index.js"),
56
- architecture: lambda.Architecture.ARM_64,
57
- runtime: lambda.Runtime.NODEJS_LATEST,
58
- memorySize: 128,
59
- timeout: props.timeout ?? DEFAULT_TIMEOUT,
60
- environment: {
61
- NODE_OPTIONS: "--enable-source-maps",
62
- },
63
- bundling: {
64
- minify: false,
65
- sourceMap: true,
66
- },
67
- ...(props.vpc ? { vpc: props.vpc, subnets: props.vpc.privateSubnets } : {}),
68
- });
69
- props.authToken?.grantRead(registrationHandler);
70
- const registrationProvider = new cr.Provider(this, "RegistrationProvider", {
71
- onEventHandler: registrationHandler,
72
- });
73
- this.serviceToken = registrationProvider.serviceToken;
74
- }
75
- }
76
- exports.RegistrationProvider = RegistrationProvider;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9yZWdpc3RyYXRpb24tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwyQ0FBdUM7QUFFdkMsMkVBQTZEO0FBQzdELDBEQUE2QjtBQUM3QiwrREFBaUQ7QUFDakQsaURBQW1DO0FBQ25DLGlFQUFtRDtBQUduRCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVsRCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBR2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUU7UUFDakgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzNCO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ3RGLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLG1CQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQztZQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQ3hDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDckMsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxlQUFlO1lBQ3pDLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsc0JBQXNCO2FBQ3JDO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFNBQVMsRUFBRSxJQUFJO2FBQ2hCO1lBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RSxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRWhELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUN6RSxjQUFjLEVBQUUsbUJBQW1CO1NBQ3BDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQWpDRCxvREFpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIHNzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfbm9kZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3IgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSBjZGsuRHVyYXRpb24uc2Vjb25kcygxMjApO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogeyBhdXRoVG9rZW4/OiBzc20uSVNlY3JldDsgdGltZW91dD86IGNkay5EdXJhdGlvbjsgdnBjPzogZWMyLlZwYyB9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVXNpbmcgVlBDIVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyYXRpb25IYW5kbGVyID0gbmV3IGxhbWJkYV9ub2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiUmVnaXN0cmF0aW9uSGFuZGxlclwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0YXRlIGN1c3RvbSByZWdpc3RyYXRpb24gaGFuZGxlclwiLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsIFwicmVnaXN0ZXItc2VydmljZS1oYW5kbGVyL2luZGV4LmpzXCIpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfT1BUSU9OUzogXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgfSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi4ocHJvcHMudnBjID8geyB2cGM6IHByb3BzLnZwYywgc3VibmV0czogcHJvcHMudnBjLnByaXZhdGVTdWJuZXRzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcHJvcHMuYXV0aFRva2VuPy5ncmFudFJlYWQocmVnaXN0cmF0aW9uSGFuZGxlcik7XG5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Qcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiByZWdpc3RyYXRpb25IYW5kbGVyLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmljZVRva2VuID0gcmVnaXN0cmF0aW9uUHJvdmlkZXIuc2VydmljZVRva2VuO1xuICB9XG59XG4iXX0=
@@ -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==
@@ -1,13 +0,0 @@
1
- import * as iam from "aws-cdk-lib/aws-iam";
2
- import * as cdk from "aws-cdk-lib";
3
- import * as ssm from "aws-cdk-lib/aws-secretsmanager";
4
- /**
5
- * Represents an instance of the Restate service. This could represent a self-hosted broker, or Restate's managed
6
- * service.
7
- */
8
- export interface RestateInstance {
9
- readonly invokerRole: iam.IRole;
10
- readonly metaEndpoint: string;
11
- readonly authToken?: ssm.ISecret;
12
- readonly registrationProviderToken: cdk.CfnOutput;
13
- }
@@ -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
package/test/.keep DELETED
File without changes