@restatedev/restate-cdk 0.0.0-SNAPSHOT-20231127205526
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/.github/workflows/publish.yml +23 -0
- package/.github/workflows/test.yml +48 -0
- package/.prettierrc +7 -0
- package/README.md +3 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/lambda-service-registry.d.ts +36 -0
- package/dist/lambda-service-registry.js +85 -0
- package/dist/register-service-handler/index.d.ts +16 -0
- package/dist/register-service-handler/index.js +99 -0
- package/dist/single-node-restate-instance.d.ts +39 -0
- package/dist/single-node-restate-instance.js +156 -0
- package/jest.config.js +8 -0
- package/package.json +39 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Publish package to NPM
|
|
2
|
+
on:
|
|
3
|
+
release:
|
|
4
|
+
types: [ published ]
|
|
5
|
+
jobs:
|
|
6
|
+
build:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
packages: write
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v3
|
|
13
|
+
# Setup .npmrc file to publish to NPM
|
|
14
|
+
- uses: actions/setup-node@v3
|
|
15
|
+
with:
|
|
16
|
+
node-version: "16.x"
|
|
17
|
+
registry-url: 'https://registry.npmjs.org'
|
|
18
|
+
- run: npm ci
|
|
19
|
+
- run: npm run build
|
|
20
|
+
- run: npm run test
|
|
21
|
+
- run: npm publish --tag latest --access public
|
|
22
|
+
env:
|
|
23
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: Build and test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
# prevent from running on forks
|
|
12
|
+
if: github.repository_owner == 'restatedev'
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
node-version: [ 19.x ]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v3
|
|
20
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
21
|
+
uses: actions/setup-node@v3
|
|
22
|
+
with:
|
|
23
|
+
node-version: ${{ matrix.node-version }}
|
|
24
|
+
registry-url: 'https://registry.npmjs.org'
|
|
25
|
+
- run: npm ci
|
|
26
|
+
- run: npm run build
|
|
27
|
+
- run: npm run test
|
|
28
|
+
- run: mv $(npm pack) restatedev-restate-cdk.tgz
|
|
29
|
+
- uses: actions/upload-artifact@v3
|
|
30
|
+
with:
|
|
31
|
+
name: restatedev-restate-cdk
|
|
32
|
+
path: restatedev-restate-cdk.tgz
|
|
33
|
+
retention-days: 1
|
|
34
|
+
if-no-files-found: error
|
|
35
|
+
|
|
36
|
+
- name: Publish snapshot
|
|
37
|
+
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
|
38
|
+
env:
|
|
39
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
40
|
+
run: |
|
|
41
|
+
# We're using 0.0.0 to avoid this version to be higher than released versions.
|
|
42
|
+
# To use it:
|
|
43
|
+
# "@restatedev/restate-cdk": "^0.0.0-SNAPSHOT"
|
|
44
|
+
npm version 0.0.0-SNAPSHOT-$(date '+%Y%m%d%H%M%S') --git-tag-version false
|
|
45
|
+
# We use dist-tag dev for the snapshot releases, see https://docs.npmjs.com/cli/v9/commands/npm-dist-tag for more info
|
|
46
|
+
# A snapshot MUST not be published with latest tag (omitting --tag defaults to latest) to avoid users to install snapshot releases
|
|
47
|
+
# when using npm install
|
|
48
|
+
npm publish --tag dev --access public
|
package/.prettierrc
ADDED
package/README.md
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./lambda-service-registry"), exports);
|
|
18
|
+
__exportStar(require("./single-node-restate-instance"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBMEM7QUFDMUMsaUVBQStDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbGFtYmRhLXNlcnZpY2UtcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpbmdsZS1ub2RlLXJlc3RhdGUtaW5zdGFuY2VcIjsiXX0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as lambda from "aws-cdk-lib/aws-lambda";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
/**
|
|
4
|
+
* A Restate RPC service path. Example: `greeter`.
|
|
5
|
+
*/
|
|
6
|
+
type RestatePath = string;
|
|
7
|
+
export interface RestateInstanceRef {
|
|
8
|
+
readonly metaEndpoint: string;
|
|
9
|
+
readonly invokerRoleArn: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A collection of Lambda Restate RPC Service handlers.
|
|
13
|
+
*/
|
|
14
|
+
export type LambdaServiceRegistryProps = {
|
|
15
|
+
/**
|
|
16
|
+
* Mappings from service path to Lambda handler.
|
|
17
|
+
*/
|
|
18
|
+
serviceHandlers: Record<RestatePath, lambda.Function>;
|
|
19
|
+
/**
|
|
20
|
+
* Custom resource provider token required for service discovery.
|
|
21
|
+
*/
|
|
22
|
+
registrationProviderToken: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Represents a collection of Lambda-based Restate RPC services. This component is used to register
|
|
26
|
+
* them with a single Restate instance. This creates a custom resource which will trigger service
|
|
27
|
+
* discovery on any handler changes deployed through CDK/CloudFormation.
|
|
28
|
+
*/
|
|
29
|
+
export declare class LambdaServiceRegistry extends Construct {
|
|
30
|
+
private readonly serviceHandlers;
|
|
31
|
+
private readonly registrationProviderToken;
|
|
32
|
+
constructor(scope: Construct, id: string, props: LambdaServiceRegistryProps);
|
|
33
|
+
register(restate: RestateInstanceRef): void;
|
|
34
|
+
private registerHandler;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.LambdaServiceRegistry = void 0;
|
|
27
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
28
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
29
|
+
const constructs_1 = require("constructs");
|
|
30
|
+
/**
|
|
31
|
+
* Represents a collection of Lambda-based Restate RPC services. This component is used to register
|
|
32
|
+
* them with a single Restate instance. This creates a custom resource which will trigger service
|
|
33
|
+
* discovery on any handler changes deployed through CDK/CloudFormation.
|
|
34
|
+
*/
|
|
35
|
+
class LambdaServiceRegistry extends constructs_1.Construct {
|
|
36
|
+
constructor(scope, id, props) {
|
|
37
|
+
super(scope, id);
|
|
38
|
+
this.serviceHandlers = props.serviceHandlers;
|
|
39
|
+
this.registrationProviderToken = props.registrationProviderToken;
|
|
40
|
+
}
|
|
41
|
+
register(restate) {
|
|
42
|
+
const allowInvokeFunction = new iam.Policy(this, "AllowInvokeFunction", {
|
|
43
|
+
statements: [
|
|
44
|
+
new iam.PolicyStatement({
|
|
45
|
+
sid: "AllowInvokeAnyFunctionVersion",
|
|
46
|
+
actions: ["lambda:InvokeFunction"],
|
|
47
|
+
resources: Object.values(this.serviceHandlers)
|
|
48
|
+
.map(handler => handler.functionArn + ":*"),
|
|
49
|
+
}),
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole", restate.invokerRoleArn);
|
|
53
|
+
invokerRole.attachInlinePolicy(allowInvokeFunction);
|
|
54
|
+
for (const [path, handler] of Object.entries(this.serviceHandlers)) {
|
|
55
|
+
this.registerHandler(restate, { path, handler }, allowInvokeFunction);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
registerHandler(restate, service, allowInvokeFunction) {
|
|
59
|
+
const registrar = new RestateServiceRegistrar(this, service.handler.node.id + "Discovery", {
|
|
60
|
+
restate,
|
|
61
|
+
service,
|
|
62
|
+
serviceToken: this.registrationProviderToken,
|
|
63
|
+
});
|
|
64
|
+
// CloudFormation doesn't know that Restate depends on this role to call services; we must ensure that Lambda
|
|
65
|
+
// permission changes are applied before we can trigger discovery (represented by the registrar).
|
|
66
|
+
registrar.node.addDependency(allowInvokeFunction);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.LambdaServiceRegistry = LambdaServiceRegistry;
|
|
70
|
+
class RestateServiceRegistrar extends constructs_1.Construct {
|
|
71
|
+
constructor(scope, id, props) {
|
|
72
|
+
super(scope, id);
|
|
73
|
+
new cdk.CustomResource(this, props.service.handler.node.id + "Discovery", {
|
|
74
|
+
serviceToken: props.serviceToken,
|
|
75
|
+
resourceType: "Custom::RestateServiceRegistrar",
|
|
76
|
+
properties: {
|
|
77
|
+
servicePath: props.service.path,
|
|
78
|
+
metaEndpoint: props.restate.metaEndpoint,
|
|
79
|
+
serviceLambdaArn: props.service.handler.currentVersion.functionArn,
|
|
80
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXNlcnZpY2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLHlEQUEyQztBQUUzQywyQ0FBdUM7QUE0QnZDOzs7O0dBSUc7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBSWxELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztJQUNuRSxDQUFDO0lBRU0sUUFBUSxDQUFDLE9BQTJCO1FBQ3pDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUN0RSxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixHQUFHLEVBQUUsK0JBQStCO29CQUNwQyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzt5QkFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7aUJBQzlDLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RGLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXBELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUEyQixFQUFFLE9BR3BELEVBQUUsbUJBQStCO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDekYsT0FBTztZQUNQLE9BQU87WUFDUCxZQUFZLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtTQUM3QyxDQUFDLENBQUM7UUFFSCw2R0FBNkc7UUFDN0csaUdBQWlHO1FBQ2pHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBN0NELHNEQTZDQztBQUVELE1BQU0sdUJBQXdCLFNBQVEsc0JBQVM7SUFDN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFDNUIsS0FPQztRQUVYLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsRUFBRTtZQUN4RSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsWUFBWSxFQUFFLGlDQUFpQztZQUMvQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDL0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWTtnQkFDeEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVc7Z0JBQ2xFLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU87YUFDUjtTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvblByb3BlcnRpZXMgfSBmcm9tIFwiLi9yZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXJcIjtcblxuLyoqXG4gKiBBIFJlc3RhdGUgUlBDIHNlcnZpY2UgcGF0aC4gRXhhbXBsZTogYGdyZWV0ZXJgLlxuICovXG50eXBlIFJlc3RhdGVQYXRoID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVJbnN0YW5jZVJlZiB7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBpbnZva2VyUm9sZUFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBMYW1iZGEgUmVzdGF0ZSBSUEMgU2VydmljZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5ncyBmcm9tIHNlcnZpY2UgcGF0aCB0byBMYW1iZGEgaGFuZGxlci5cbiAgICovXG4gIHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgdG9rZW4gcmVxdWlyZWQgZm9yIHNlcnZpY2UgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIExhbWJkYS1iYXNlZCBSZXN0YXRlIFJQQyBzZXJ2aWNlcy4gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byByZWdpc3RlclxuICogdGhlbSB3aXRoIGEgc2luZ2xlIFJlc3RhdGUgaW5zdGFuY2UuIFRoaXMgY3JlYXRlcyBhIGN1c3RvbSByZXNvdXJjZSB3aGljaCB3aWxsIHRyaWdnZXIgc2VydmljZVxuICogZGlzY292ZXJ5IG9uIGFueSBoYW5kbGVyIGNoYW5nZXMgZGVwbG95ZWQgdGhyb3VnaCBDREsvQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFTZXJ2aWNlUmVnaXN0cnkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zZXJ2aWNlSGFuZGxlcnMgPSBwcm9wcy5zZXJ2aWNlSGFuZGxlcnM7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gcHJvcHMucmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlcihyZXN0YXRlOiBSZXN0YXRlSW5zdGFuY2VSZWYpIHtcbiAgICBjb25zdCBhbGxvd0ludm9rZUZ1bmN0aW9uID0gbmV3IGlhbS5Qb2xpY3kodGhpcywgXCJBbGxvd0ludm9rZUZ1bmN0aW9uXCIsIHtcbiAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIHNpZDogXCJBbGxvd0ludm9rZUFueUZ1bmN0aW9uVmVyc2lvblwiLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IE9iamVjdC52YWx1ZXModGhpcy5zZXJ2aWNlSGFuZGxlcnMpXG4gICAgICAgICAgICAubWFwKGhhbmRsZXIgPT4gaGFuZGxlci5mdW5jdGlvbkFybiArIFwiOipcIiksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludm9rZXJSb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgXCJJbnZva2VyUm9sZVwiLCByZXN0YXRlLmludm9rZXJSb2xlQXJuKTtcbiAgICBpbnZva2VyUm9sZS5hdHRhY2hJbmxpbmVQb2xpY3koYWxsb3dJbnZva2VGdW5jdGlvbik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNlcnZpY2VIYW5kbGVycykpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJIYW5kbGVyKHJlc3RhdGUsIHsgcGF0aCwgaGFuZGxlciB9LCBhbGxvd0ludm9rZUZ1bmN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlcihyZXN0YXRlOiBSZXN0YXRlSW5zdGFuY2VSZWYsIHNlcnZpY2U6IHtcbiAgICBwYXRoOiBSZXN0YXRlUGF0aCxcbiAgICBoYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb25cbiAgfSwgYWxsb3dJbnZva2VGdW5jdGlvbjogaWFtLlBvbGljeSkge1xuICAgIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBSZXN0YXRlU2VydmljZVJlZ2lzdHJhcih0aGlzLCBzZXJ2aWNlLmhhbmRsZXIubm9kZS5pZCArIFwiRGlzY292ZXJ5XCIsIHtcbiAgICAgIHJlc3RhdGUsXG4gICAgICBzZXJ2aWNlLFxuICAgICAgc2VydmljZVRva2VuOiB0aGlzLnJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW4sXG4gICAgfSk7XG5cbiAgICAvLyBDbG91ZEZvcm1hdGlvbiBkb2Vzbid0IGtub3cgdGhhdCBSZXN0YXRlIGRlcGVuZHMgb24gdGhpcyByb2xlIHRvIGNhbGwgc2VydmljZXM7IHdlIG11c3QgZW5zdXJlIHRoYXQgTGFtYmRhXG4gICAgLy8gcGVybWlzc2lvbiBjaGFuZ2VzIGFyZSBhcHBsaWVkIGJlZm9yZSB3ZSBjYW4gdHJpZ2dlciBkaXNjb3ZlcnkgKHJlcHJlc2VudGVkIGJ5IHRoZSByZWdpc3RyYXIpLlxuICAgIHJlZ2lzdHJhci5ub2RlLmFkZERlcGVuZGVuY3koYWxsb3dJbnZva2VGdW5jdGlvbik7XG4gIH1cbn1cblxuY2xhc3MgUmVzdGF0ZVNlcnZpY2VSZWdpc3RyYXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLFxuICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgIHJlc3RhdGU6IFJlc3RhdGVJbnN0YW5jZVJlZixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiB7XG4gICAgICAgICAgICAgICAgICBwYXRoOiBSZXN0YXRlUGF0aCxcbiAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGxhbWJkYS5GdW5jdGlvblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VydmljZVRva2VuOiBzdHJpbmdcbiAgICAgICAgICAgICAgfSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgcHJvcHMuc2VydmljZS5oYW5kbGVyLm5vZGUuaWQgKyBcIkRpc2NvdmVyeVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlJlc3RhdGVTZXJ2aWNlUmVnaXN0cmFyXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNlcnZpY2VQYXRoOiBwcm9wcy5zZXJ2aWNlLnBhdGgsXG4gICAgICAgIG1ldGFFbmRwb2ludDogcHJvcHMucmVzdGF0ZS5tZXRhRW5kcG9pbnQsXG4gICAgICAgIHNlcnZpY2VMYW1iZGFBcm46IHByb3BzLnNlcnZpY2UuaGFuZGxlci5jdXJyZW50VmVyc2lvbi5mdW5jdGlvbkFybixcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIH0gc2F0aXNmaWVzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMsXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CloudFormationCustomResourceResponse } from "aws-lambda";
|
|
2
|
+
import { Handler } from "aws-lambda/handler";
|
|
3
|
+
import { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
|
|
4
|
+
import * as cdk from "aws-cdk-lib";
|
|
5
|
+
export interface RegistrationProperties {
|
|
6
|
+
servicePath?: string;
|
|
7
|
+
metaEndpoint?: string;
|
|
8
|
+
serviceEndpoint?: string;
|
|
9
|
+
serviceLambdaArn?: string;
|
|
10
|
+
removalPolicy?: cdk.RemovalPolicy;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
14
|
+
* {@link RestateLambdaServiceCollection} to facilitate Lambda service handler discovery.
|
|
15
|
+
*/
|
|
16
|
+
export declare const handler: Handler<CloudFormationCustomResourceEvent, Partial<CloudFormationCustomResourceResponse>>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handler = void 0;
|
|
7
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
8
|
+
/**
|
|
9
|
+
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
10
|
+
* {@link RestateLambdaServiceCollection} to facilitate Lambda service handler discovery.
|
|
11
|
+
*/
|
|
12
|
+
const handler = async function (event) {
|
|
13
|
+
console.log({ event });
|
|
14
|
+
if (event.RequestType === "Delete") {
|
|
15
|
+
// Since we retain older Lambda handler versions on update, we also leave the registered service alone. There may
|
|
16
|
+
// be unfinished invocations that require it; in the future we would want to inform Restate that we want to
|
|
17
|
+
// de-register the service, and wait for Restate to let us know that it is safe to delete the deployed Function
|
|
18
|
+
// version from Lambda.
|
|
19
|
+
// const props = event.ResourceProperties as RegistrationProperties;
|
|
20
|
+
// if (props.removalPolicy === cdk.RemovalPolicy.DESTROY) {
|
|
21
|
+
// const controller = new AbortController();
|
|
22
|
+
// const id = btoa(props.serviceLambdaArn!); // TODO: we should be treating service ids as opaque
|
|
23
|
+
// const deleteResponse = await fetch(`${props.metaEndpoint}/endpoints/${id}?force=true`,
|
|
24
|
+
// {
|
|
25
|
+
// signal: controller.signal,
|
|
26
|
+
// method: "DELETE",
|
|
27
|
+
// })
|
|
28
|
+
// .finally(() => clearTimeout(registerCallTimeout));
|
|
29
|
+
// console.log(`Got delete response back: ${deleteResponse.status}`);
|
|
30
|
+
// }
|
|
31
|
+
return {
|
|
32
|
+
Status: "SUCCESS",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const props = event.ResourceProperties;
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const healthCheckTimeout = setTimeout(() => controller.abort("timeout"), 5000);
|
|
38
|
+
const healthCheckUrl = `${props.metaEndpoint}/health`;
|
|
39
|
+
console.log(`Performing health check against: ${healthCheckUrl}`);
|
|
40
|
+
const healthResponse = await (0, node_fetch_1.default)(healthCheckUrl, {
|
|
41
|
+
signal: controller.signal,
|
|
42
|
+
})
|
|
43
|
+
.finally(() => clearTimeout(healthCheckTimeout));
|
|
44
|
+
console.log(`Got health check response back: ${healthResponse.status}`);
|
|
45
|
+
if (!(healthResponse.status >= 200 && healthResponse.status < 300)) {
|
|
46
|
+
console.error(`Restate health check failed: ${healthResponse.statusText} (${healthResponse.status})`);
|
|
47
|
+
return {
|
|
48
|
+
Reason: `Restate health check failed: ${healthResponse.statusText} (${healthResponse.status})`,
|
|
49
|
+
Status: "FAILED",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
let attempt = 1;
|
|
53
|
+
const registerCallTimeout = setTimeout(() => controller.abort("timeout"), 10000);
|
|
54
|
+
const discoveryEndpointUrl = `${props.metaEndpoint}/endpoints`;
|
|
55
|
+
const registrationRequest = JSON.stringify({ arn: props.serviceLambdaArn });
|
|
56
|
+
console.log(`Triggering registration at ${discoveryEndpointUrl}: ${registrationRequest} (attempt ${attempt})`);
|
|
57
|
+
while (true) {
|
|
58
|
+
try {
|
|
59
|
+
const discoveryResponse = await (0, node_fetch_1.default)(discoveryEndpointUrl, {
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: registrationRequest,
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
.finally(() => clearTimeout(registerCallTimeout));
|
|
68
|
+
console.log(`Got registration response back: ${discoveryResponse.status}`);
|
|
69
|
+
if (discoveryResponse.status >= 200 && discoveryResponse.status < 300) {
|
|
70
|
+
const response = await discoveryResponse.json();
|
|
71
|
+
if (response?.services?.[0]?.name !== props.servicePath) {
|
|
72
|
+
console.error(`Service registration failed: ${discoveryResponse.statusText} (${discoveryResponse.status})`);
|
|
73
|
+
return {
|
|
74
|
+
Reason: `Restate service registration failed: name returned by service ("${response?.services?.[0]?.name})) does not match expected ("${props.servicePath}")`,
|
|
75
|
+
Status: "FAILED",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
Data: response,
|
|
80
|
+
Status: "SUCCESS",
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
console.log(`Service registration call failed: ${e?.message} (attempt ${attempt})`);
|
|
86
|
+
}
|
|
87
|
+
attempt += 1;
|
|
88
|
+
if (attempt >= 3) {
|
|
89
|
+
console.error(`Service registration failed after ${attempt} attempts.`);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
Reason: `Restate service registration failed: ${healthResponse.statusText} (${healthResponse.status})`,
|
|
95
|
+
Status: "FAILED",
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
exports.handler = handler;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSw0REFBK0I7QUFnQi9COzs7R0FHRztBQUNJLE1BQU0sT0FBTyxHQUNsQixLQUFLLFdBQVUsS0FBSztJQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV2QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFO1FBQ2xDLGlIQUFpSDtRQUNqSCwyR0FBMkc7UUFDM0csK0dBQStHO1FBQy9HLHVCQUF1QjtRQUV2QixvRUFBb0U7UUFDcEUsMkRBQTJEO1FBQzNELDhDQUE4QztRQUM5QyxtR0FBbUc7UUFDbkcsMkZBQTJGO1FBQzNGLFFBQVE7UUFDUixtQ0FBbUM7UUFDbkMsMEJBQTBCO1FBQzFCLFNBQVM7UUFDVCx5REFBeUQ7UUFDekQsdUVBQXVFO1FBQ3ZFLElBQUk7UUFFSixPQUFPO1lBQ0wsTUFBTSxFQUFFLFNBQVM7U0FDc0MsQ0FBQztLQUMzRDtJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUVqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSyxDQUFDLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxTQUFTLENBQUM7SUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNsRSxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUEsb0JBQUssRUFBQyxjQUFjLEVBQy9DO1FBQ0UsTUFB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QUFDLEVBQUU7WUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsT0FBTyxZQUFZLENBQUMsQ0FBQztZQUN4RSxNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU87UUFDTCxNQUFNLEVBQUUsd0NBQXdDLGNBQWMsQ0FBQyxVQUFVLEtBQUssY0FBYyxDQUFDLE1BQU0sR0FBRztRQUN0RyxNQUFNLEVBQUUsUUFBUTtLQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBcEdTLFFBQUEsT0FBTyxXQW9HaEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2UgfSBmcm9tIFwiYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhL2hhbmRsZXJcIjtcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhL3RyaWdnZXIvY2xvdWRmb3JtYXRpb24tY3VzdG9tLXJlc291cmNlXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgc2VydmljZVBhdGg/OiBzdHJpbmc7XG4gIG1ldGFFbmRwb2ludD86IHN0cmluZztcbiAgc2VydmljZUVuZHBvaW50Pzogc3RyaW5nO1xuICBzZXJ2aWNlTGFtYmRhQXJuPzogc3RyaW5nO1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG59XG5cbnR5cGUgRW5kcG9pbnRSZXNwb25zZSA9IHtcbiAgaWQ/OiBzdHJpbmcsXG4gIHNlcnZpY2VzPzogeyBuYW1lPzogc3RyaW5nLCByZXZpc2lvbj86IG51bWJlciB9W11cbn1cblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBSZXN0YXRlTGFtYmRhU2VydmljZUNvbGxlY3Rpb259IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgUGFydGlhbDxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+PiA9XG4gIGFzeW5jIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXCJEZWxldGVcIikge1xuICAgICAgLy8gU2luY2Ugd2UgcmV0YWluIG9sZGVyIExhbWJkYSBoYW5kbGVyIHZlcnNpb25zIG9uIHVwZGF0ZSwgd2UgYWxzbyBsZWF2ZSB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIGFsb25lLiBUaGVyZSBtYXlcbiAgICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgICAvLyBkZS1yZWdpc3RlciB0aGUgc2VydmljZSwgYW5kIHdhaXQgZm9yIFJlc3RhdGUgdG8gbGV0IHVzIGtub3cgdGhhdCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgZGVwbG95ZWQgRnVuY3Rpb25cbiAgICAgIC8vIHZlcnNpb24gZnJvbSBMYW1iZGEuXG5cbiAgICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgICAvLyBpZiAocHJvcHMucmVtb3ZhbFBvbGljeSA9PT0gY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSkge1xuICAgICAgLy8gICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMubWV0YUVuZHBvaW50fS9lbmRwb2ludHMvJHtpZH0/Zm9yY2U9dHJ1ZWAsXG4gICAgICAvLyAgICAge1xuICAgICAgLy8gICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgIC8vICAgICB9KVxuICAgICAgLy8gICAgIC5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChyZWdpc3RlckNhbGxUaW1lb3V0KSk7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBHb3QgZGVsZXRlIHJlc3BvbnNlIGJhY2s6ICR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBTdGF0dXM6IFwiU1VDQ0VTU1wiLFxuICAgICAgfSBzYXRpc2ZpZXMgUGFydGlhbDxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICBjb25zdCBoZWFsdGhDaGVja1VybCA9IGAke3Byb3BzLm1ldGFFbmRwb2ludH0vaGVhbHRoYDtcbiAgICBjb25zb2xlLmxvZyhgUGVyZm9ybWluZyBoZWFsdGggY2hlY2sgYWdhaW5zdDogJHtoZWFsdGhDaGVja1VybH1gKTtcbiAgICBjb25zdCBoZWFsdGhSZXNwb25zZSA9IGF3YWl0IGZldGNoKGhlYWx0aENoZWNrVXJsLFxuICAgICAge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChoZWFsdGhDaGVja1RpbWVvdXQpKTtcblxuICAgIGNvbnNvbGUubG9nKGBHb3QgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGJhY2s6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIGlmICghKGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgaGVhbHRoUmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBSZWFzb246IGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfSlgLFxuICAgICAgICBTdGF0dXM6IFwiRkFJTEVEXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBhdHRlbXB0ID0gMTtcbiAgICBjb25zdCByZWdpc3RlckNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICBjb25zdCBkaXNjb3ZlcnlFbmRwb2ludFVybCA9IGAke3Byb3BzLm1ldGFFbmRwb2ludH0vZW5kcG9pbnRzYDtcbiAgICBjb25zdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBhcm46IHByb3BzLnNlcnZpY2VMYW1iZGFBcm4gfSk7XG4gICAgY29uc29sZS5sb2coYFRyaWdnZXJpbmcgcmVnaXN0cmF0aW9uIGF0ICR7ZGlzY292ZXJ5RW5kcG9pbnRVcmx9OiAke3JlZ2lzdHJhdGlvblJlcXVlc3R9IChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpc2NvdmVyeVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZGlzY292ZXJ5RW5kcG9pbnRVcmwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBib2R5OiByZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQocmVnaXN0ZXJDYWxsVGltZW91dCkpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGBHb3QgcmVnaXN0cmF0aW9uIHJlc3BvbnNlIGJhY2s6ICR7ZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzfWApO1xuXG4gICAgICAgIGlmIChkaXNjb3ZlcnlSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGRpc2NvdmVyeVJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGlzY292ZXJ5UmVzcG9uc2UuanNvbigpIGFzIEVuZHBvaW50UmVzcG9uc2U7XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWUgIT09IHByb3BzLnNlcnZpY2VQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7ZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7ZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIFJlYXNvbjogYFJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiBuYW1lIHJldHVybmVkIGJ5IHNlcnZpY2UgKFwiJHtyZXNwb25zZT8uc2VydmljZXM/LlswXT8ubmFtZX0pKSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCAoXCIke3Byb3BzLnNlcnZpY2VQYXRofVwiKWAsXG4gICAgICAgICAgICAgIFN0YXR1czogXCJGQUlMRURcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIERhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgU3RhdHVzOiBcIlNVQ0NFU1NcIixcbiAgICAgICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZT47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGNhbGwgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX0gKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICAgIH1cblxuICAgICAgYXR0ZW1wdCArPSAxO1xuICAgICAgaWYgKGF0dGVtcHQgPj0gMykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0cy5gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFJlYXNvbjogYFJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgIFN0YXR1czogXCJGQUlMRURcIixcbiAgICB9O1xuICB9OyJdfQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import * as logs from "aws-cdk-lib/aws-logs";
|
|
3
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
4
|
+
import * as iam from "aws-cdk-lib/aws-iam";
|
|
5
|
+
import * as cdk from "aws-cdk-lib";
|
|
6
|
+
import * as cr from "aws-cdk-lib/custom-resources";
|
|
7
|
+
/**
|
|
8
|
+
* Represents an instance of the Restate service. This could represent a self-hosted broker, or Restate's managed
|
|
9
|
+
* service.
|
|
10
|
+
*/
|
|
11
|
+
export interface RestateInstance {
|
|
12
|
+
readonly invokerRole: iam.Role;
|
|
13
|
+
readonly metaEndpoint: string;
|
|
14
|
+
readonly registrationProviderToken: cdk.CfnOutput;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
18
|
+
* suitable for development and testing purposes.
|
|
19
|
+
*/
|
|
20
|
+
export declare class SingleNodeRestateInstance extends Construct implements RestateInstance {
|
|
21
|
+
readonly instance: ec2.Instance;
|
|
22
|
+
readonly invokerRole: iam.Role;
|
|
23
|
+
readonly vpc: ec2.Vpc;
|
|
24
|
+
readonly publicIngressEndpoint: string;
|
|
25
|
+
readonly privateIngressEndpoint: string;
|
|
26
|
+
readonly metaEndpoint: string;
|
|
27
|
+
readonly registrationProvider: cr.Provider;
|
|
28
|
+
readonly registrationProviderToken: cdk.CfnOutput;
|
|
29
|
+
constructor(scope: Construct, id: string, props: {
|
|
30
|
+
prefix?: string;
|
|
31
|
+
restateTag?: string;
|
|
32
|
+
logGroup: logs.LogGroup;
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Creates a custom resource provider to facilitate service discovery. Note that the custom resource event handler
|
|
36
|
+
* must be able to reach the Restate instance's meta endpoint - which is why it is deployed within the same VPC.
|
|
37
|
+
*/
|
|
38
|
+
private createRegistrationProvider;
|
|
39
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.SingleNodeRestateInstance = void 0;
|
|
30
|
+
const constructs_1 = require("constructs");
|
|
31
|
+
const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
|
|
32
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
33
|
+
const elb_v2 = __importStar(require("aws-cdk-lib/aws-elasticloadbalancingv2"));
|
|
34
|
+
const aws_elasticloadbalancingv2_targets_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2-targets");
|
|
35
|
+
const lambda_node = __importStar(require("aws-cdk-lib/aws-lambda-nodejs"));
|
|
36
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
37
|
+
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
38
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
39
|
+
const cr = __importStar(require("aws-cdk-lib/custom-resources"));
|
|
40
|
+
const RESTATE_INGRESS_PORT = 8080;
|
|
41
|
+
const RESTATE_META_PORT = 9070;
|
|
42
|
+
const RESTATE_DOCKER_DEFAULT_TAG = "latest";
|
|
43
|
+
/**
|
|
44
|
+
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
45
|
+
* suitable for development and testing purposes.
|
|
46
|
+
*/
|
|
47
|
+
class SingleNodeRestateInstance extends constructs_1.Construct {
|
|
48
|
+
constructor(scope, id, props) {
|
|
49
|
+
super(scope, id);
|
|
50
|
+
this.vpc = new ec2.Vpc(this, "RestateVpc", {
|
|
51
|
+
maxAzs: 3,
|
|
52
|
+
});
|
|
53
|
+
this.invokerRole = new iam.Role(this, "InstanceRole", {
|
|
54
|
+
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
|
|
55
|
+
managedPolicies: [
|
|
56
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore"),
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
props.logGroup.grantWrite(this.invokerRole);
|
|
60
|
+
const restateTag = props.restateTag ?? RESTATE_DOCKER_DEFAULT_TAG;
|
|
61
|
+
const restateInitCommands = ec2.UserData.forLinux();
|
|
62
|
+
restateInitCommands.addCommands("sudo yum update -y", "sudo yum install -y docker", "sudo systemctl enable docker.service", "sudo systemctl start docker.service", [
|
|
63
|
+
"sudo docker run --name restate --restart on-failure:10 --detach",
|
|
64
|
+
" --volume /var/restate:/target --network=host",
|
|
65
|
+
" -e RESTATE_OBSERVABILITY__LOG__FORMAT=Json -e RUST_LOG=info,restate_worker::partition=warn",
|
|
66
|
+
` --log-driver=awslogs --log-opt awslogs-group=${props.logGroup.logGroupName}`,
|
|
67
|
+
` ghcr.io/restatedev/restate-dist:${restateTag}`,
|
|
68
|
+
].join(""));
|
|
69
|
+
const restateInstance = new ec2.Instance(this, "Host", {
|
|
70
|
+
vpc: this.vpc,
|
|
71
|
+
instanceType: new ec2.InstanceType("t4g.micro"),
|
|
72
|
+
machineImage: ec2.MachineImage.latestAmazonLinux2023({
|
|
73
|
+
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
|
|
74
|
+
}),
|
|
75
|
+
role: this.invokerRole,
|
|
76
|
+
userData: restateInitCommands,
|
|
77
|
+
});
|
|
78
|
+
this.instance = restateInstance;
|
|
79
|
+
const restateInstanceSecurityGroup = new ec2.SecurityGroup(this, "RestateSecurityGroup", {
|
|
80
|
+
vpc: this.vpc,
|
|
81
|
+
securityGroupName: "RestateSecurityGroup",
|
|
82
|
+
description: "Allow inbound traffic to Restate",
|
|
83
|
+
});
|
|
84
|
+
const ingressLoadBalancer = new elb_v2.ApplicationLoadBalancer(this, "RestateAlb", {
|
|
85
|
+
vpc: this.vpc,
|
|
86
|
+
internetFacing: true,
|
|
87
|
+
});
|
|
88
|
+
const targetGroup = new elb_v2.ApplicationTargetGroup(this, "TargetGroup", {
|
|
89
|
+
vpc: this.vpc,
|
|
90
|
+
port: RESTATE_INGRESS_PORT,
|
|
91
|
+
targets: [new aws_elasticloadbalancingv2_targets_1.InstanceTarget(restateInstance)],
|
|
92
|
+
healthCheck: {
|
|
93
|
+
path: "/grpc.health.v1.Health/Check",
|
|
94
|
+
protocol: elb_v2.Protocol.HTTP,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
// TODO: Make this HTTPS (https://github.com/restatedev/restate-cdk-support/issues/2)
|
|
98
|
+
ingressLoadBalancer.addListener("Listener", {
|
|
99
|
+
port: 80,
|
|
100
|
+
defaultTargetGroups: [targetGroup],
|
|
101
|
+
});
|
|
102
|
+
const albSecurityGroup = new ec2.SecurityGroup(this, "AlbSecurityGroup", {
|
|
103
|
+
vpc: this.vpc,
|
|
104
|
+
description: "ALB security group",
|
|
105
|
+
allowAllOutbound: false,
|
|
106
|
+
});
|
|
107
|
+
albSecurityGroup.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow outbound HTTP traffic to Restate ingress");
|
|
108
|
+
ingressLoadBalancer.addSecurityGroup(albSecurityGroup);
|
|
109
|
+
restateInstanceSecurityGroup.addIngressRule(albSecurityGroup, ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow traffic from ALB to Restate ingress");
|
|
110
|
+
// These rules allow the service registration component to trigger service discovery as needed; the requests
|
|
111
|
+
// originate from a VPC-bound Lambda function that backs the custom resource.
|
|
112
|
+
this.vpc.privateSubnets.forEach((subnet) => {
|
|
113
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.ipv4(subnet.ipv4CidrBlock), ec2.Port.tcp(RESTATE_META_PORT), "Allow traffic from the VPC to Restate meta");
|
|
114
|
+
});
|
|
115
|
+
this.vpc.privateSubnets.forEach((subnet) => {
|
|
116
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.ipv4(subnet.ipv4CidrBlock), ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow traffic from the VPC to Restate ingress");
|
|
117
|
+
});
|
|
118
|
+
restateInstance.addSecurityGroup(restateInstanceSecurityGroup);
|
|
119
|
+
const registrationProvider = this.createRegistrationProvider();
|
|
120
|
+
this.registrationProvider = registrationProvider;
|
|
121
|
+
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
122
|
+
description: "Custom resource provider service token, needed by the Restate service registry component to trigger discovery",
|
|
123
|
+
exportName: [props.prefix, "RegistrationProviderToken"].join("-"),
|
|
124
|
+
value: registrationProvider.serviceToken,
|
|
125
|
+
});
|
|
126
|
+
this.publicIngressEndpoint = `http://${ingressLoadBalancer.loadBalancerDnsName}`;
|
|
127
|
+
this.privateIngressEndpoint = `http://${this.instance.instancePrivateDnsName}:${RESTATE_INGRESS_PORT}`;
|
|
128
|
+
this.metaEndpoint = `http://${this.instance.instancePrivateDnsName}:${RESTATE_META_PORT}`;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Creates a custom resource provider to facilitate service discovery. Note that the custom resource event handler
|
|
132
|
+
* must be able to reach the Restate instance's meta endpoint - which is why it is deployed within the same VPC.
|
|
133
|
+
*/
|
|
134
|
+
createRegistrationProvider() {
|
|
135
|
+
const registrationHandler = new lambda_node.NodejsFunction(this, "RegistrationHandler", {
|
|
136
|
+
description: "Restate custom registration handler",
|
|
137
|
+
entry: node_path_1.default.join(__dirname, "register-service-handler/index.js"),
|
|
138
|
+
architecture: lambda.Architecture.ARM_64,
|
|
139
|
+
runtime: lambda.Runtime.NODEJS_LATEST,
|
|
140
|
+
memorySize: 128,
|
|
141
|
+
timeout: cdk.Duration.seconds(60),
|
|
142
|
+
environment: {
|
|
143
|
+
NODE_OPTIONS: "--enable-source-maps",
|
|
144
|
+
},
|
|
145
|
+
vpc: this.vpc,
|
|
146
|
+
vpcSubnets: {
|
|
147
|
+
subnets: this.vpc.privateSubnets,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
return new cr.Provider(this, "RegistrationProvider", {
|
|
151
|
+
onEventHandler: registrationHandler,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.SingleNodeRestateInstance = SingleNodeRestateInstance;
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvc2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF1QztBQUV2Qyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLCtFQUFpRTtBQUNqRSx1R0FBZ0Y7QUFDaEYsMkVBQTZEO0FBQzdELDBEQUE2QjtBQUM3QiwrREFBaUQ7QUFDakQsaURBQW1DO0FBQ25DLGlFQUFtRDtBQUVuRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUNsQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUMvQixNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQztBQVk1Qzs7O0dBR0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLHNCQUFTO0lBV3RELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0U7UUFDaEgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3pDLE1BQU0sRUFBRSxDQUFDO1NBQ1YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNwRCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7WUFDeEQsZUFBZSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsOEJBQThCLENBQUM7YUFDM0U7U0FDRixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFNUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSwwQkFBMEIsQ0FBQztRQUNsRSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEQsbUJBQW1CLENBQUMsV0FBVyxDQUM3QixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLHNDQUFzQyxFQUN0QyxxQ0FBcUMsRUFDckM7WUFDRSxpRUFBaUU7WUFDakUsK0NBQStDO1lBQy9DLDZGQUE2RjtZQUM3RixpREFBaUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDOUUsb0NBQW9DLFVBQVUsRUFBRTtTQUNqRCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDWCxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDckQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsWUFBWSxFQUFFLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDL0MsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUM7Z0JBQ25ELE9BQU8sRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUMsTUFBTTthQUN2QyxDQUFDO1lBQ0YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3RCLFFBQVEsRUFBRSxtQkFBbUI7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFlLENBQUM7UUFFaEMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3ZGLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLGlCQUFpQixFQUFFLHNCQUFzQjtZQUN6QyxXQUFXLEVBQUUsa0NBQWtDO1NBQ2hELENBQUMsQ0FBQztRQUVILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUNqRixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3pFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsT0FBTyxFQUFFLENBQUMsSUFBSSxtREFBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsOEJBQThCO2dCQUNwQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gscUZBQXFGO1FBQ3JGLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDMUMsSUFBSSxFQUFFLEVBQUU7WUFDUixtQkFBbUIsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFFSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FBQztRQUNILGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztRQUN6SSxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZELDRCQUE0QixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLDJDQUEyQyxDQUFDLENBQUM7UUFFL0ksNEdBQTRHO1FBQzVHLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN6Qyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsNENBQTRDLENBQUMsQ0FBQztRQUNsSyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pDLDRCQUE0QixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3hLLENBQUMsQ0FBQyxDQUFDO1FBQ0gsZUFBZSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFL0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDakQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7WUFDcEYsV0FBVyxFQUFFLCtHQUErRztZQUM1SCxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNqRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsWUFBWTtTQUN6QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsVUFBVSxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN2RyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQzVGLENBQUM7SUFFRDs7O09BR0c7SUFDSywwQkFBMEI7UUFDaEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ3RGLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLG1CQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQztZQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQ3hDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDckMsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsc0JBQXNCO2FBQ3JDO1lBQ0QsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsVUFBVSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWM7YUFDakM7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDbkQsY0FBYyxFQUFFLG1CQUFtQjtTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF4SUQsOERBd0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgZWxiX3YyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgSW5zdGFuY2VUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjItdGFyZ2V0c1wiO1xuaW1wb3J0ICogYXMgbGFtYmRhX25vZGUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5cbmNvbnN0IFJFU1RBVEVfSU5HUkVTU19QT1JUID0gODA4MDtcbmNvbnN0IFJFU1RBVEVfTUVUQV9QT1JUID0gOTA3MDtcbmNvbnN0IFJFU1RBVEVfRE9DS0VSX0RFRkFVTFRfVEFHID0gXCJsYXRlc3RcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIHRoZSBSZXN0YXRlIHNlcnZpY2UuIFRoaXMgY291bGQgcmVwcmVzZW50IGEgc2VsZi1ob3N0ZWQgYnJva2VyLCBvciBSZXN0YXRlJ3MgbWFuYWdlZFxuICogc2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0YXRlSW5zdGFuY2Uge1xuICByZWFkb25seSBpbnZva2VyUm9sZTogaWFtLlJvbGU7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlclRva2VuOiBjZGsuQ2ZuT3V0cHV0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBiYWNrZWQgYnkgYSBzaW5nbGUgRUMyIGluc3RhbmNlLFxuICogc3VpdGFibGUgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlTm9kZVJlc3RhdGVJbnN0YW5jZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIFJlc3RhdGVJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGluc3RhbmNlOiBlYzIuSW5zdGFuY2U7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uUm9sZTtcbiAgcmVhZG9ubHkgdnBjOiBlYzIuVnBjO1xuXG4gIHJlYWRvbmx5IHB1YmxpY0luZ3Jlc3NFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBwcml2YXRlSW5ncmVzc0VuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlcjogY3IuUHJvdmlkZXI7XG4gIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW46IGNkay5DZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IHsgcHJlZml4Pzogc3RyaW5nLCByZXN0YXRlVGFnPzogc3RyaW5nLCBsb2dHcm91cDogbG9ncy5Mb2dHcm91cCB9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMudnBjID0gbmV3IGVjMi5WcGModGhpcywgXCJSZXN0YXRlVnBjXCIsIHtcbiAgICAgIG1heEF6czogMyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJJbnN0YW5jZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBbWF6b25TU01NYW5hZ2VkSW5zdGFuY2VDb3JlXCIpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBwcm9wcy5sb2dHcm91cC5ncmFudFdyaXRlKHRoaXMuaW52b2tlclJvbGUpO1xuXG4gICAgY29uc3QgcmVzdGF0ZVRhZyA9IHByb3BzLnJlc3RhdGVUYWcgPz8gUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUc7XG4gICAgY29uc3QgcmVzdGF0ZUluaXRDb21tYW5kcyA9IGVjMi5Vc2VyRGF0YS5mb3JMaW51eCgpO1xuICAgIHJlc3RhdGVJbml0Q29tbWFuZHMuYWRkQ29tbWFuZHMoXG4gICAgICBcInN1ZG8geXVtIHVwZGF0ZSAteVwiLFxuICAgICAgXCJzdWRvIHl1bSBpbnN0YWxsIC15IGRvY2tlclwiLFxuICAgICAgXCJzdWRvIHN5c3RlbWN0bCBlbmFibGUgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgIFwic3VkbyBzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgIFtcbiAgICAgICAgXCJzdWRvIGRvY2tlciBydW4gLS1uYW1lIHJlc3RhdGUgLS1yZXN0YXJ0IG9uLWZhaWx1cmU6MTAgLS1kZXRhY2hcIixcbiAgICAgICAgXCIgLS12b2x1bWUgL3Zhci9yZXN0YXRlOi90YXJnZXQgLS1uZXR3b3JrPWhvc3RcIixcbiAgICAgICAgXCIgLWUgUkVTVEFURV9PQlNFUlZBQklMSVRZX19MT0dfX0ZPUk1BVD1Kc29uIC1lIFJVU1RfTE9HPWluZm8scmVzdGF0ZV93b3JrZXI6OnBhcnRpdGlvbj13YXJuXCIsXG4gICAgICAgIGAgLS1sb2ctZHJpdmVyPWF3c2xvZ3MgLS1sb2ctb3B0IGF3c2xvZ3MtZ3JvdXA9JHtwcm9wcy5sb2dHcm91cC5sb2dHcm91cE5hbWV9YCxcbiAgICAgICAgYCBnaGNyLmlvL3Jlc3RhdGVkZXYvcmVzdGF0ZS1kaXN0OiR7cmVzdGF0ZVRhZ31gLFxuICAgICAgXS5qb2luKFwiXCIpLFxuICAgICk7XG5cbiAgICBjb25zdCByZXN0YXRlSW5zdGFuY2UgPSBuZXcgZWMyLkluc3RhbmNlKHRoaXMsIFwiSG9zdFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgZWMyLkluc3RhbmNlVHlwZShcInQ0Zy5taWNyb1wiKSxcbiAgICAgIG1hY2hpbmVJbWFnZTogZWMyLk1hY2hpbmVJbWFnZS5sYXRlc3RBbWF6b25MaW51eDIwMjMoe1xuICAgICAgICBjcHVUeXBlOiBlYzIuQW1hem9uTGludXhDcHVUeXBlLkFSTV82NCxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogdGhpcy5pbnZva2VyUm9sZSxcbiAgICAgIHVzZXJEYXRhOiByZXN0YXRlSW5pdENvbW1hbmRzLFxuICAgIH0pO1xuICAgIHRoaXMuaW5zdGFuY2UgPSByZXN0YXRlSW5zdGFuY2U7XG5cbiAgICBjb25zdCByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwiUmVzdGF0ZVNlY3VyaXR5R3JvdXBcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBcIlJlc3RhdGVTZWN1cml0eUdyb3VwXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBbGxvdyBpbmJvdW5kIHRyYWZmaWMgdG8gUmVzdGF0ZVwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5ncmVzc0xvYWRCYWxhbmNlciA9IG5ldyBlbGJfdjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIodGhpcywgXCJSZXN0YXRlQWxiXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXRHcm91cCA9IG5ldyBlbGJfdjIuQXBwbGljYXRpb25UYXJnZXRHcm91cCh0aGlzLCBcIlRhcmdldEdyb3VwXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBwb3J0OiBSRVNUQVRFX0lOR1JFU1NfUE9SVCxcbiAgICAgIHRhcmdldHM6IFtuZXcgSW5zdGFuY2VUYXJnZXQocmVzdGF0ZUluc3RhbmNlKV0sXG4gICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICBwYXRoOiBcIi9ncnBjLmhlYWx0aC52MS5IZWFsdGgvQ2hlY2tcIixcbiAgICAgICAgcHJvdG9jb2w6IGVsYl92Mi5Qcm90b2NvbC5IVFRQLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgSFRUUFMgKGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Jlc3RhdGUtY2RrLXN1cHBvcnQvaXNzdWVzLzIpXG4gICAgaW5ncmVzc0xvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcIkxpc3RlbmVyXCIsIHtcbiAgICAgIHBvcnQ6IDgwLFxuICAgICAgZGVmYXVsdFRhcmdldEdyb3VwczogW3RhcmdldEdyb3VwXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsYlNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgXCJBbGJTZWN1cml0eUdyb3VwXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBTEIgc2VjdXJpdHkgZ3JvdXBcIixcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIGFsYlNlY3VyaXR5R3JvdXAuYWRkRWdyZXNzUnVsZShlYzIuUGVlci5hbnlJcHY0KCksIGVjMi5Qb3J0LnRjcChSRVNUQVRFX0lOR1JFU1NfUE9SVCksIFwiQWxsb3cgb3V0Ym91bmQgSFRUUCB0cmFmZmljIHRvIFJlc3RhdGUgaW5ncmVzc1wiKTtcbiAgICBpbmdyZXNzTG9hZEJhbGFuY2VyLmFkZFNlY3VyaXR5R3JvdXAoYWxiU2VjdXJpdHlHcm91cCk7XG5cbiAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKGFsYlNlY3VyaXR5R3JvdXAsIGVjMi5Qb3J0LnRjcChSRVNUQVRFX0lOR1JFU1NfUE9SVCksIFwiQWxsb3cgdHJhZmZpYyBmcm9tIEFMQiB0byBSZXN0YXRlIGluZ3Jlc3NcIik7XG5cbiAgICAvLyBUaGVzZSBydWxlcyBhbGxvdyB0aGUgc2VydmljZSByZWdpc3RyYXRpb24gY29tcG9uZW50IHRvIHRyaWdnZXIgc2VydmljZSBkaXNjb3ZlcnkgYXMgbmVlZGVkOyB0aGUgcmVxdWVzdHNcbiAgICAvLyBvcmlnaW5hdGUgZnJvbSBhIFZQQy1ib3VuZCBMYW1iZGEgZnVuY3Rpb24gdGhhdCBiYWNrcyB0aGUgY3VzdG9tIHJlc291cmNlLlxuICAgIHRoaXMudnBjLnByaXZhdGVTdWJuZXRzLmZvckVhY2goKHN1Ym5ldCkgPT4ge1xuICAgICAgcmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShlYzIuUGVlci5pcHY0KHN1Ym5ldC5pcHY0Q2lkckJsb2NrKSwgZWMyLlBvcnQudGNwKFJFU1RBVEVfTUVUQV9QT1JUKSwgXCJBbGxvdyB0cmFmZmljIGZyb20gdGhlIFZQQyB0byBSZXN0YXRlIG1ldGFcIik7XG4gICAgfSk7XG4gICAgdGhpcy52cGMucHJpdmF0ZVN1Ym5ldHMuZm9yRWFjaCgoc3VibmV0KSA9PiB7XG4gICAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKGVjMi5QZWVyLmlwdjQoc3VibmV0LmlwdjRDaWRyQmxvY2spLCBlYzIuUG9ydC50Y3AoUkVTVEFURV9JTkdSRVNTX1BPUlQpLCBcIkFsbG93IHRyYWZmaWMgZnJvbSB0aGUgVlBDIHRvIFJlc3RhdGUgaW5ncmVzc1wiKTtcbiAgICB9KTtcbiAgICByZXN0YXRlSW5zdGFuY2UuYWRkU2VjdXJpdHlHcm91cChyZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwKTtcblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvblByb3ZpZGVyID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Qcm92aWRlcigpO1xuICAgIHRoaXMucmVnaXN0cmF0aW9uUHJvdmlkZXIgPSByZWdpc3RyYXRpb25Qcm92aWRlcjtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW4gPSBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW5cIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiQ3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHNlcnZpY2UgdG9rZW4sIG5lZWRlZCBieSB0aGUgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJ5IGNvbXBvbmVudCB0byB0cmlnZ2VyIGRpc2NvdmVyeVwiLFxuICAgICAgZXhwb3J0TmFtZTogW3Byb3BzLnByZWZpeCwgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCJdLmpvaW4oXCItXCIpLFxuICAgICAgdmFsdWU6IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcblxuICAgIHRoaXMucHVibGljSW5ncmVzc0VuZHBvaW50ID0gYGh0dHA6Ly8ke2luZ3Jlc3NMb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX1gO1xuICAgIHRoaXMucHJpdmF0ZUluZ3Jlc3NFbmRwb2ludCA9IGBodHRwOi8vJHt0aGlzLmluc3RhbmNlLmluc3RhbmNlUHJpdmF0ZURuc05hbWV9OiR7UkVTVEFURV9JTkdSRVNTX1BPUlR9YDtcbiAgICB0aGlzLm1ldGFFbmRwb2ludCA9IGBodHRwOi8vJHt0aGlzLmluc3RhbmNlLmluc3RhbmNlUHJpdmF0ZURuc05hbWV9OiR7UkVTVEFURV9NRVRBX1BPUlR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHRvIGZhY2lsaXRhdGUgc2VydmljZSBkaXNjb3ZlcnkuIE5vdGUgdGhhdCB0aGUgY3VzdG9tIHJlc291cmNlIGV2ZW50IGhhbmRsZXJcbiAgICogbXVzdCBiZSBhYmxlIHRvIHJlYWNoIHRoZSBSZXN0YXRlIGluc3RhbmNlJ3MgbWV0YSBlbmRwb2ludCAtIHdoaWNoIGlzIHdoeSBpdCBpcyBkZXBsb3llZCB3aXRoaW4gdGhlIHNhbWUgVlBDLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVSZWdpc3RyYXRpb25Qcm92aWRlcigpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25IYW5kbGVyID0gbmV3IGxhbWJkYV9ub2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiUmVnaXN0cmF0aW9uSGFuZGxlclwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0YXRlIGN1c3RvbSByZWdpc3RyYXRpb24gaGFuZGxlclwiLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsIFwicmVnaXN0ZXItc2VydmljZS1oYW5kbGVyL2luZGV4LmpzXCIpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX09QVElPTlM6IFwiLS1lbmFibGUtc291cmNlLW1hcHNcIixcbiAgICAgIH0sXG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRzOiB0aGlzLnZwYy5wcml2YXRlU3VibmV0cyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IGNyLlByb3ZpZGVyKHRoaXMsIFwiUmVnaXN0cmF0aW9uUHJvdmlkZXJcIiwge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHJlZ2lzdHJhdGlvbkhhbmRsZXIsXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
package/jest.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@restatedev/restate-cdk",
|
|
3
|
+
"description": "Restate.dev CDK constructs",
|
|
4
|
+
"version": "0.0.0-SNAPSHOT-20231127205526",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc --noEmitOnError",
|
|
9
|
+
"prebundle": "rm -rf dist",
|
|
10
|
+
"postbundle": "cd dist && zip -r index.zip index.js*",
|
|
11
|
+
"watch": "tsc -w",
|
|
12
|
+
"test": "jest",
|
|
13
|
+
"cdk": "cdk"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/aws-lambda": "^8.10.126",
|
|
17
|
+
"@types/jest": "^29.5.8",
|
|
18
|
+
"@types/node": "20.9.0",
|
|
19
|
+
"@types/source-map-support": "^0.5.10",
|
|
20
|
+
"aws-cdk": "2.108.0",
|
|
21
|
+
"esbuild": "^0.19.6",
|
|
22
|
+
"jest": "^29.7.0",
|
|
23
|
+
"node-fetch": "^3.3.2",
|
|
24
|
+
"ts-jest": "^29.1.1",
|
|
25
|
+
"ts-node": "^10.9.1",
|
|
26
|
+
"typescript": "~5.2.2"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"aws-cdk-lib": "2.108.0",
|
|
30
|
+
"constructs": "^10.0.0",
|
|
31
|
+
"source-map-support": "^0.5.21"
|
|
32
|
+
},
|
|
33
|
+
"directories": {
|
|
34
|
+
"lib": "lib",
|
|
35
|
+
"test": "test"
|
|
36
|
+
},
|
|
37
|
+
"author": "Restate Developers",
|
|
38
|
+
"license": "MIT"
|
|
39
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": [
|
|
6
|
+
"es2020",
|
|
7
|
+
"dom"
|
|
8
|
+
],
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"noImplicitAny": true,
|
|
12
|
+
"strictNullChecks": true,
|
|
13
|
+
"noImplicitThis": true,
|
|
14
|
+
"alwaysStrict": true,
|
|
15
|
+
"noUnusedLocals": false,
|
|
16
|
+
"noUnusedParameters": false,
|
|
17
|
+
"noImplicitReturns": true,
|
|
18
|
+
"noFallthroughCasesInSwitch": false,
|
|
19
|
+
"inlineSourceMap": true,
|
|
20
|
+
"inlineSources": true,
|
|
21
|
+
"experimentalDecorators": true,
|
|
22
|
+
"strictPropertyInitialization": false,
|
|
23
|
+
"typeRoots": [
|
|
24
|
+
"./node_modules/@types"
|
|
25
|
+
],
|
|
26
|
+
"esModuleInterop": true,
|
|
27
|
+
"outDir": "dist"
|
|
28
|
+
},
|
|
29
|
+
"include": [
|
|
30
|
+
"lib/**/*"
|
|
31
|
+
],
|
|
32
|
+
"exclude": [
|
|
33
|
+
"node_modules",
|
|
34
|
+
"cdk.out"
|
|
35
|
+
]
|
|
36
|
+
}
|