@kapeta/local-cluster-service 0.0.0-96f91ef
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/.eslintrc.cjs +25 -0
- package/.github/workflows/check-license.yml +17 -0
- package/.github/workflows/main.yml +26 -0
- package/.prettierignore +4 -0
- package/.vscode/launch.json +19 -0
- package/CHANGELOG.md +920 -0
- package/LICENSE +38 -0
- package/README.md +36 -0
- package/definitions.d.ts +35 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.js +263 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
- package/dist/cjs/src/RepositoryWatcher.js +332 -0
- package/dist/cjs/src/ai/aiClient.d.ts +20 -0
- package/dist/cjs/src/ai/aiClient.js +74 -0
- package/dist/cjs/src/ai/routes.d.ts +7 -0
- package/dist/cjs/src/ai/routes.js +37 -0
- package/dist/cjs/src/ai/transform.d.ts +11 -0
- package/dist/cjs/src/ai/transform.js +239 -0
- package/dist/cjs/src/ai/types.d.ts +40 -0
- package/dist/cjs/src/ai/types.js +2 -0
- package/dist/cjs/src/api.d.ts +7 -0
- package/dist/cjs/src/api.js +29 -0
- package/dist/cjs/src/assetManager.d.ts +41 -0
- package/dist/cjs/src/assetManager.js +274 -0
- package/dist/cjs/src/assets/routes.d.ts +7 -0
- package/dist/cjs/src/assets/routes.js +165 -0
- package/dist/cjs/src/attachments/routes.d.ts +7 -0
- package/dist/cjs/src/attachments/routes.js +72 -0
- package/dist/cjs/src/authManager.d.ts +16 -0
- package/dist/cjs/src/authManager.js +64 -0
- package/dist/cjs/src/cacheManager.d.ts +20 -0
- package/dist/cjs/src/cacheManager.js +51 -0
- package/dist/cjs/src/clusterService.d.ts +44 -0
- package/dist/cjs/src/clusterService.js +120 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
- package/dist/cjs/src/codeGeneratorManager.js +93 -0
- package/dist/cjs/src/config/routes.d.ts +7 -0
- package/dist/cjs/src/config/routes.js +160 -0
- package/dist/cjs/src/configManager.d.ts +42 -0
- package/dist/cjs/src/configManager.js +136 -0
- package/dist/cjs/src/containerManager.d.ts +148 -0
- package/dist/cjs/src/containerManager.js +958 -0
- package/dist/cjs/src/definitionsManager.d.ts +20 -0
- package/dist/cjs/src/definitionsManager.js +171 -0
- package/dist/cjs/src/filesystem/routes.d.ts +7 -0
- package/dist/cjs/src/filesystem/routes.js +105 -0
- package/dist/cjs/src/filesystemManager.d.ts +27 -0
- package/dist/cjs/src/filesystemManager.js +118 -0
- package/dist/cjs/src/identities/routes.d.ts +7 -0
- package/dist/cjs/src/identities/routes.js +37 -0
- package/dist/cjs/src/instanceManager.d.ts +69 -0
- package/dist/cjs/src/instanceManager.js +910 -0
- package/dist/cjs/src/instances/routes.d.ts +7 -0
- package/dist/cjs/src/instances/routes.js +179 -0
- package/dist/cjs/src/middleware/cors.d.ts +6 -0
- package/dist/cjs/src/middleware/cors.js +14 -0
- package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
- package/dist/cjs/src/middleware/kapeta.js +28 -0
- package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
- package/dist/cjs/src/middleware/stringBody.js +18 -0
- package/dist/cjs/src/networkManager.d.ts +37 -0
- package/dist/cjs/src/networkManager.js +119 -0
- package/dist/cjs/src/operatorManager.d.ts +41 -0
- package/dist/cjs/src/operatorManager.js +211 -0
- package/dist/cjs/src/progressListener.d.ts +31 -0
- package/dist/cjs/src/progressListener.js +133 -0
- package/dist/cjs/src/providerManager.d.ts +11 -0
- package/dist/cjs/src/providerManager.js +84 -0
- package/dist/cjs/src/providers/routes.d.ts +7 -0
- package/dist/cjs/src/providers/routes.js +46 -0
- package/dist/cjs/src/proxy/routes.d.ts +7 -0
- package/dist/cjs/src/proxy/routes.js +115 -0
- package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
- package/dist/cjs/src/proxy/types/rest.js +123 -0
- package/dist/cjs/src/proxy/types/web.d.ts +8 -0
- package/dist/cjs/src/proxy/types/web.js +61 -0
- package/dist/cjs/src/repositoryManager.d.ts +35 -0
- package/dist/cjs/src/repositoryManager.js +247 -0
- package/dist/cjs/src/serviceManager.d.ts +36 -0
- package/dist/cjs/src/serviceManager.js +106 -0
- package/dist/cjs/src/socketManager.d.ts +32 -0
- package/dist/cjs/src/socketManager.js +125 -0
- package/dist/cjs/src/storageService.d.ts +21 -0
- package/dist/cjs/src/storageService.js +81 -0
- package/dist/cjs/src/taskManager.d.ts +70 -0
- package/dist/cjs/src/taskManager.js +181 -0
- package/dist/cjs/src/tasks/routes.d.ts +7 -0
- package/dist/cjs/src/tasks/routes.js +39 -0
- package/dist/cjs/src/traffic/routes.d.ts +7 -0
- package/dist/cjs/src/traffic/routes.js +22 -0
- package/dist/cjs/src/types.d.ts +99 -0
- package/dist/cjs/src/types.js +39 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
- package/dist/cjs/src/utils/LogData.d.ts +23 -0
- package/dist/cjs/src/utils/LogData.js +46 -0
- package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/cjs/src/utils/commandLineUtils.js +39 -0
- package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
- package/dist/cjs/src/utils/utils.d.ts +40 -0
- package/dist/cjs/src/utils/utils.js +148 -0
- package/dist/cjs/start.d.ts +5 -0
- package/dist/cjs/start.js +17 -0
- package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/cjs/test/proxy/types/rest.test.js +48 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.js +263 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
- package/dist/esm/src/RepositoryWatcher.js +332 -0
- package/dist/esm/src/ai/aiClient.d.ts +20 -0
- package/dist/esm/src/ai/aiClient.js +74 -0
- package/dist/esm/src/ai/routes.d.ts +7 -0
- package/dist/esm/src/ai/routes.js +37 -0
- package/dist/esm/src/ai/transform.d.ts +11 -0
- package/dist/esm/src/ai/transform.js +239 -0
- package/dist/esm/src/ai/types.d.ts +40 -0
- package/dist/esm/src/ai/types.js +2 -0
- package/dist/esm/src/api.d.ts +7 -0
- package/dist/esm/src/api.js +29 -0
- package/dist/esm/src/assetManager.d.ts +41 -0
- package/dist/esm/src/assetManager.js +274 -0
- package/dist/esm/src/assets/routes.d.ts +7 -0
- package/dist/esm/src/assets/routes.js +165 -0
- package/dist/esm/src/attachments/routes.d.ts +7 -0
- package/dist/esm/src/attachments/routes.js +72 -0
- package/dist/esm/src/authManager.d.ts +16 -0
- package/dist/esm/src/authManager.js +64 -0
- package/dist/esm/src/cacheManager.d.ts +20 -0
- package/dist/esm/src/cacheManager.js +51 -0
- package/dist/esm/src/clusterService.d.ts +44 -0
- package/dist/esm/src/clusterService.js +120 -0
- package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
- package/dist/esm/src/codeGeneratorManager.js +93 -0
- package/dist/esm/src/config/routes.d.ts +7 -0
- package/dist/esm/src/config/routes.js +160 -0
- package/dist/esm/src/configManager.d.ts +42 -0
- package/dist/esm/src/configManager.js +136 -0
- package/dist/esm/src/containerManager.d.ts +148 -0
- package/dist/esm/src/containerManager.js +958 -0
- package/dist/esm/src/definitionsManager.d.ts +20 -0
- package/dist/esm/src/definitionsManager.js +171 -0
- package/dist/esm/src/filesystem/routes.d.ts +7 -0
- package/dist/esm/src/filesystem/routes.js +105 -0
- package/dist/esm/src/filesystemManager.d.ts +27 -0
- package/dist/esm/src/filesystemManager.js +118 -0
- package/dist/esm/src/identities/routes.d.ts +7 -0
- package/dist/esm/src/identities/routes.js +37 -0
- package/dist/esm/src/instanceManager.d.ts +69 -0
- package/dist/esm/src/instanceManager.js +910 -0
- package/dist/esm/src/instances/routes.d.ts +7 -0
- package/dist/esm/src/instances/routes.js +179 -0
- package/dist/esm/src/middleware/cors.d.ts +6 -0
- package/dist/esm/src/middleware/cors.js +14 -0
- package/dist/esm/src/middleware/kapeta.d.ts +15 -0
- package/dist/esm/src/middleware/kapeta.js +28 -0
- package/dist/esm/src/middleware/stringBody.d.ts +9 -0
- package/dist/esm/src/middleware/stringBody.js +18 -0
- package/dist/esm/src/networkManager.d.ts +37 -0
- package/dist/esm/src/networkManager.js +119 -0
- package/dist/esm/src/operatorManager.d.ts +41 -0
- package/dist/esm/src/operatorManager.js +211 -0
- package/dist/esm/src/progressListener.d.ts +31 -0
- package/dist/esm/src/progressListener.js +133 -0
- package/dist/esm/src/providerManager.d.ts +11 -0
- package/dist/esm/src/providerManager.js +84 -0
- package/dist/esm/src/providers/routes.d.ts +7 -0
- package/dist/esm/src/providers/routes.js +46 -0
- package/dist/esm/src/proxy/routes.d.ts +7 -0
- package/dist/esm/src/proxy/routes.js +115 -0
- package/dist/esm/src/proxy/types/rest.d.ts +10 -0
- package/dist/esm/src/proxy/types/rest.js +123 -0
- package/dist/esm/src/proxy/types/web.d.ts +8 -0
- package/dist/esm/src/proxy/types/web.js +61 -0
- package/dist/esm/src/repositoryManager.d.ts +35 -0
- package/dist/esm/src/repositoryManager.js +247 -0
- package/dist/esm/src/serviceManager.d.ts +36 -0
- package/dist/esm/src/serviceManager.js +106 -0
- package/dist/esm/src/socketManager.d.ts +32 -0
- package/dist/esm/src/socketManager.js +125 -0
- package/dist/esm/src/storageService.d.ts +21 -0
- package/dist/esm/src/storageService.js +81 -0
- package/dist/esm/src/taskManager.d.ts +70 -0
- package/dist/esm/src/taskManager.js +181 -0
- package/dist/esm/src/tasks/routes.d.ts +7 -0
- package/dist/esm/src/tasks/routes.js +39 -0
- package/dist/esm/src/traffic/routes.d.ts +7 -0
- package/dist/esm/src/traffic/routes.js +22 -0
- package/dist/esm/src/types.d.ts +99 -0
- package/dist/esm/src/types.js +39 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
- package/dist/esm/src/utils/LogData.d.ts +23 -0
- package/dist/esm/src/utils/LogData.js +46 -0
- package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/esm/src/utils/commandLineUtils.js +39 -0
- package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/esm/src/utils/pathTemplateParser.js +135 -0
- package/dist/esm/src/utils/utils.d.ts +40 -0
- package/dist/esm/src/utils/utils.js +148 -0
- package/dist/esm/start.d.ts +5 -0
- package/dist/esm/start.js +17 -0
- package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/esm/test/proxy/types/rest.test.js +48 -0
- package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
- package/index.ts +280 -0
- package/jest.config.js +8 -0
- package/package.json +134 -0
- package/src/RepositoryWatcher.ts +363 -0
- package/src/ai/aiClient.ts +93 -0
- package/src/ai/routes.ts +39 -0
- package/src/ai/transform.ts +275 -0
- package/src/ai/types.ts +45 -0
- package/src/api.ts +32 -0
- package/src/assetManager.ts +355 -0
- package/src/assets/routes.ts +183 -0
- package/src/attachments/routes.ts +79 -0
- package/src/authManager.ts +67 -0
- package/src/cacheManager.ts +59 -0
- package/src/clusterService.ts +142 -0
- package/src/codeGeneratorManager.ts +109 -0
- package/src/config/routes.ts +201 -0
- package/src/configManager.ts +180 -0
- package/src/containerManager.ts +1178 -0
- package/src/definitionsManager.ts +212 -0
- package/src/filesystem/routes.ts +123 -0
- package/src/filesystemManager.ts +133 -0
- package/src/identities/routes.ts +38 -0
- package/src/instanceManager.ts +1160 -0
- package/src/instances/routes.ts +203 -0
- package/src/middleware/cors.ts +14 -0
- package/src/middleware/kapeta.ts +41 -0
- package/src/middleware/stringBody.ts +21 -0
- package/src/networkManager.ts +148 -0
- package/src/operatorManager.ts +294 -0
- package/src/progressListener.ts +151 -0
- package/src/providerManager.ts +97 -0
- package/src/providers/routes.ts +51 -0
- package/src/proxy/routes.ts +153 -0
- package/src/proxy/types/rest.ts +172 -0
- package/src/proxy/types/web.ts +70 -0
- package/src/repositoryManager.ts +291 -0
- package/src/serviceManager.ts +133 -0
- package/src/socketManager.ts +138 -0
- package/src/storageService.ts +97 -0
- package/src/taskManager.ts +247 -0
- package/src/tasks/routes.ts +43 -0
- package/src/traffic/routes.ts +23 -0
- package/src/types.ts +112 -0
- package/src/utils/BlockInstanceRunner.ts +577 -0
- package/src/utils/DefaultProviderInstaller.ts +150 -0
- package/src/utils/InternalConfigProvider.ts +214 -0
- package/src/utils/LogData.ts +50 -0
- package/src/utils/commandLineUtils.ts +45 -0
- package/src/utils/pathTemplateParser.ts +157 -0
- package/src/utils/utils.ts +155 -0
- package/start.ts +14 -0
- package/test/proxy/types/rest.test.ts +54 -0
- package/test/utils/pathTemplateParser.test.ts +29 -0
- package/tsconfig.json +15 -0
@@ -0,0 +1,211 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Copyright 2023 Kapeta Inc.
|
4
|
+
* SPDX-License-Identifier: BUSL-1.1
|
5
|
+
*/
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
8
|
+
};
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
exports.operatorManager = void 0;
|
11
|
+
const path_1 = __importDefault(require("path"));
|
12
|
+
const md5_1 = __importDefault(require("md5"));
|
13
|
+
const serviceManager_1 = require("./serviceManager");
|
14
|
+
const storageService_1 = require("./storageService");
|
15
|
+
const containerManager_1 = require("./containerManager");
|
16
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
17
|
+
const types_1 = require("./types");
|
18
|
+
const definitionsManager_1 = require("./definitionsManager");
|
19
|
+
const utils_1 = require("./utils/utils");
|
20
|
+
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
21
|
+
const lodash_1 = __importDefault(require("lodash"));
|
22
|
+
const async_lock_1 = __importDefault(require("async-lock"));
|
23
|
+
const taskManager_1 = require("./taskManager");
|
24
|
+
const KIND_PLAN = 'core/plan';
|
25
|
+
class Operator {
|
26
|
+
_data;
|
27
|
+
constructor(data) {
|
28
|
+
this._data = data;
|
29
|
+
}
|
30
|
+
getLocalData() {
|
31
|
+
return this._data.definition.spec.local;
|
32
|
+
}
|
33
|
+
getDefinitionInfo() {
|
34
|
+
return this._data;
|
35
|
+
}
|
36
|
+
getCredentials() {
|
37
|
+
return this._data.definition.spec.local.credentials;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
class OperatorManager {
|
41
|
+
_mountDir;
|
42
|
+
operatorLock = new async_lock_1.default();
|
43
|
+
constructor() {
|
44
|
+
this._mountDir = path_1.default.join(storageService_1.storageService.getKapetaBasedir(), 'mounts');
|
45
|
+
fs_extra_1.default.mkdirpSync(this._mountDir);
|
46
|
+
}
|
47
|
+
_getMountPoint(operatorType, mountName) {
|
48
|
+
return path_1.default.join(this._mountDir, operatorType, mountName);
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* Get operator definition for resource type
|
52
|
+
*/
|
53
|
+
async getOperator(fullName, version) {
|
54
|
+
const operators = await definitionsManager_1.definitionsManager.getDefinitions([types_1.KIND_RESOURCE_OPERATOR, types_1.KIND_BLOCK_TYPE_OPERATOR]);
|
55
|
+
const operator = operators.find((operator) => operator.definition &&
|
56
|
+
operator.definition.metadata &&
|
57
|
+
operator.definition.metadata.name &&
|
58
|
+
operator.definition.metadata.name.toLowerCase() === fullName.toLowerCase() &&
|
59
|
+
operator.version === version);
|
60
|
+
if (!operator) {
|
61
|
+
throw new Error(`Unknown operator type: ${fullName}:${version}`);
|
62
|
+
}
|
63
|
+
if (!operator.definition.spec || !operator.definition.spec.local) {
|
64
|
+
throw new Error(`Operator missing local definition: ${fullName}:${version}`);
|
65
|
+
}
|
66
|
+
return new Operator(operator);
|
67
|
+
}
|
68
|
+
/**
|
69
|
+
* Get information about a specific consumed resource
|
70
|
+
*/
|
71
|
+
async getConsumerResourceInfo(systemId, fromServiceId, resourceType, portType, name, environment, ensureContainer = true) {
|
72
|
+
systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
|
73
|
+
const plans = await definitionsManager_1.definitionsManager.getDefinitions(KIND_PLAN);
|
74
|
+
const planUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
|
75
|
+
const currentPlan = plans.find((plan) => plan.definition.metadata.name === planUri.fullName && plan.version === planUri.version);
|
76
|
+
if (!currentPlan) {
|
77
|
+
throw new Error(`Unknown plan: ${systemId}`);
|
78
|
+
}
|
79
|
+
const currentInstance = currentPlan.definition.spec.blocks?.find((instance) => instance.id === fromServiceId);
|
80
|
+
if (!currentInstance) {
|
81
|
+
throw new Error(`Unknown instance: ${fromServiceId} in plan ${systemId}`);
|
82
|
+
}
|
83
|
+
const blockDefinition = await definitionsManager_1.definitionsManager.getDefinition(currentInstance.block.ref);
|
84
|
+
if (!blockDefinition) {
|
85
|
+
throw new Error(`Unknown block: ${currentInstance.block.ref} in plan ${systemId}`);
|
86
|
+
}
|
87
|
+
const blockResource = blockDefinition.definition.spec?.consumers?.find((resource) => {
|
88
|
+
if (resource.metadata.name !== name) {
|
89
|
+
return false;
|
90
|
+
}
|
91
|
+
return (0, nodejs_utils_1.parseKapetaUri)(resource.kind).fullName === resourceType;
|
92
|
+
});
|
93
|
+
if (!blockResource) {
|
94
|
+
throw new Error(`Unknown resource: ${name} in block ${currentInstance.block.ref} in plan ${systemId}`);
|
95
|
+
}
|
96
|
+
const kindUri = (0, nodejs_utils_1.parseKapetaUri)(blockResource.kind);
|
97
|
+
const operator = await this.getOperator(resourceType, kindUri.version);
|
98
|
+
const credentials = operator.getCredentials();
|
99
|
+
if (ensureContainer) {
|
100
|
+
await this.ensureOperator(systemId, resourceType, kindUri.version);
|
101
|
+
}
|
102
|
+
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, resourceType, portType);
|
103
|
+
if (!hostPort) {
|
104
|
+
throw new Error('Unknown resource port type : ' + resourceType + '#' + portType);
|
105
|
+
}
|
106
|
+
const dbName = name + '_' + fromServiceId.replace(/[^a-z0-9]/gi, '');
|
107
|
+
const safeName = dbName.replace('_', '-');
|
108
|
+
return {
|
109
|
+
host: (0, utils_1.getRemoteHostForEnvironment)(environment),
|
110
|
+
port: hostPort,
|
111
|
+
type: portType,
|
112
|
+
protocol: 'tcp',
|
113
|
+
options: {
|
114
|
+
// expose as fullName since that is not operator specific, but unique
|
115
|
+
fullName: safeName,
|
116
|
+
dbName,
|
117
|
+
},
|
118
|
+
credentials,
|
119
|
+
};
|
120
|
+
}
|
121
|
+
async getOperatorPorts(systemId, kind, version) {
|
122
|
+
const operator = await this.getOperator(kind, version);
|
123
|
+
const operatorData = operator.getLocalData();
|
124
|
+
const portTypes = Object.keys(operatorData.ports);
|
125
|
+
portTypes.sort();
|
126
|
+
const ports = {};
|
127
|
+
for (let i = 0; i < portTypes.length; i++) {
|
128
|
+
const portType = portTypes[i];
|
129
|
+
let containerPortInfo = operatorData.ports[portType];
|
130
|
+
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, kind, portType);
|
131
|
+
const portInfo = (0, utils_1.toPortInfo)(containerPortInfo);
|
132
|
+
const portId = portInfo.port + '/' + portInfo.type;
|
133
|
+
ports[portId] = {
|
134
|
+
type: portType,
|
135
|
+
hostPort,
|
136
|
+
protocol: portInfo.type,
|
137
|
+
};
|
138
|
+
}
|
139
|
+
return ports;
|
140
|
+
}
|
141
|
+
/**
|
142
|
+
* Ensure we have a running operator of given type
|
143
|
+
*
|
144
|
+
* @param systemId the plan ref
|
145
|
+
* @param kind the full name - e.g. myhandle/rabbitmq
|
146
|
+
* @param version the version of the operator
|
147
|
+
*/
|
148
|
+
async ensureOperator(systemId, kind, version) {
|
149
|
+
systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
|
150
|
+
const key = `${systemId}#${kind}:${version}`;
|
151
|
+
return await this.operatorLock.acquire(key, async () => {
|
152
|
+
const operator = await this.getOperator(kind, version);
|
153
|
+
const operatorData = operator.getLocalData();
|
154
|
+
const ports = await this.getOperatorPorts(systemId, kind, version);
|
155
|
+
const nameParts = [systemId, kind.toLowerCase(), version];
|
156
|
+
const containerName = `kapeta-resource-${(0, md5_1.default)(nameParts.join('_'))}`;
|
157
|
+
const PortBindings = {};
|
158
|
+
const Env = [];
|
159
|
+
const systemUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
|
160
|
+
const Labels = {
|
161
|
+
kapeta: 'true',
|
162
|
+
[containerManager_1.COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
163
|
+
[containerManager_1.COMPOSE_LABEL_SERVICE]: [kind, version].join('_').replace(/[^a-z0-9]/gi, '_'),
|
164
|
+
};
|
165
|
+
const operatorMetadata = operator.getDefinitionInfo().definition.metadata;
|
166
|
+
const hostIp = (0, utils_1.getDockerHostIp)();
|
167
|
+
const ExposedPorts = {};
|
168
|
+
lodash_1.default.forEach(ports, (portInfo, containerPort) => {
|
169
|
+
ExposedPorts['' + containerPort] = {};
|
170
|
+
PortBindings['' + containerPort] = [
|
171
|
+
{
|
172
|
+
HostPort: '' + portInfo.hostPort,
|
173
|
+
HostIp: hostIp,
|
174
|
+
},
|
175
|
+
];
|
176
|
+
Labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
177
|
+
});
|
178
|
+
const Mounts = await containerManager_1.containerManager.createVolumes(systemId, kind, operatorData.mounts);
|
179
|
+
lodash_1.default.forEach(operatorData.env, (value, name) => {
|
180
|
+
Env.push(name + '=' + value);
|
181
|
+
});
|
182
|
+
const task = taskManager_1.taskManager.add(`operator:ensure:${key}`, async () => {
|
183
|
+
let HealthCheck = undefined;
|
184
|
+
if (operatorData.health) {
|
185
|
+
HealthCheck = containerManager_1.containerManager.toDockerHealth(operatorData.health);
|
186
|
+
}
|
187
|
+
const container = await containerManager_1.containerManager.ensureContainer({
|
188
|
+
name: containerName,
|
189
|
+
Image: operatorData.image,
|
190
|
+
Hostname: containerName + '.kapeta',
|
191
|
+
Labels,
|
192
|
+
Cmd: operatorData.cmd,
|
193
|
+
ExposedPorts,
|
194
|
+
Env,
|
195
|
+
HealthCheck,
|
196
|
+
HostConfig: {
|
197
|
+
PortBindings,
|
198
|
+
Mounts,
|
199
|
+
},
|
200
|
+
});
|
201
|
+
await containerManager_1.containerManager.waitForReady(container);
|
202
|
+
return new containerManager_1.ContainerInfo(container);
|
203
|
+
}, {
|
204
|
+
name: `Ensuring ${operatorMetadata.title ?? operatorMetadata.name}`,
|
205
|
+
systemId,
|
206
|
+
});
|
207
|
+
return task.wait();
|
208
|
+
});
|
209
|
+
}
|
210
|
+
}
|
211
|
+
exports.operatorManager = new OperatorManager();
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
/// <reference types="node" />
|
6
|
+
import { LogEntry } from './types';
|
7
|
+
import { Task } from './taskManager';
|
8
|
+
export declare class ProgressListener {
|
9
|
+
private readonly systemId;
|
10
|
+
private readonly instanceId;
|
11
|
+
constructor(systemId?: string, instanceId?: string);
|
12
|
+
protected emitLog(payload: Omit<LogEntry, 'time' | 'source'>): void;
|
13
|
+
run(command: string, directory?: string): Promise<{
|
14
|
+
exit: number;
|
15
|
+
signal: NodeJS.Signals | null;
|
16
|
+
output: string;
|
17
|
+
}>;
|
18
|
+
progress(label: string, callback: () => void | Promise<void>): Promise<void>;
|
19
|
+
check(message: string, ok: boolean | Promise<boolean> | (() => Promise<boolean>)): Promise<void>;
|
20
|
+
start(label: string): void;
|
21
|
+
showValue(label: string, value: any): void;
|
22
|
+
error(msg: string, ...args: any[]): void;
|
23
|
+
warn(msg: string, ...args: any[]): void;
|
24
|
+
info(msg: string, ...args: any[]): void;
|
25
|
+
debug(msg: string, ...args: any[]): void;
|
26
|
+
}
|
27
|
+
export declare class TaskProgressListener extends ProgressListener {
|
28
|
+
private readonly task;
|
29
|
+
constructor(task: Task);
|
30
|
+
protected emitLog(payload: Omit<LogEntry, 'time' | 'source'>): void;
|
31
|
+
}
|
@@ -0,0 +1,133 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Copyright 2023 Kapeta Inc.
|
4
|
+
* SPDX-License-Identifier: BUSL-1.1
|
5
|
+
*/
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
7
|
+
exports.TaskProgressListener = exports.ProgressListener = void 0;
|
8
|
+
const nodejs_process_1 = require("@kapeta/nodejs-process");
|
9
|
+
const socketManager_1 = require("./socketManager");
|
10
|
+
const node_util_1 = require("node:util");
|
11
|
+
class ProgressListener {
|
12
|
+
systemId;
|
13
|
+
instanceId;
|
14
|
+
constructor(systemId, instanceId) {
|
15
|
+
this.systemId = systemId;
|
16
|
+
this.instanceId = instanceId;
|
17
|
+
}
|
18
|
+
emitLog(payload) {
|
19
|
+
const logEntry = {
|
20
|
+
...payload,
|
21
|
+
source: 'stdout',
|
22
|
+
time: Date.now(),
|
23
|
+
};
|
24
|
+
if (this.systemId && this.instanceId) {
|
25
|
+
socketManager_1.socketManager.emitInstanceLog(this.systemId, this.instanceId, logEntry);
|
26
|
+
return;
|
27
|
+
}
|
28
|
+
if (this.systemId) {
|
29
|
+
socketManager_1.socketManager.emitSystemLog(this.systemId, logEntry);
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
socketManager_1.socketManager.emitGlobalLog(logEntry);
|
33
|
+
}
|
34
|
+
run(command, directory) {
|
35
|
+
this.info(`Running command "${command}"`);
|
36
|
+
return new Promise(async (resolve, reject) => {
|
37
|
+
try {
|
38
|
+
const chunks = [];
|
39
|
+
const child = (0, nodejs_process_1.spawn)(command, [], {
|
40
|
+
cwd: directory ? directory : process.cwd(),
|
41
|
+
shell: true,
|
42
|
+
});
|
43
|
+
child.onData((data) => {
|
44
|
+
this.emitLog({
|
45
|
+
level: data.type === 'stdout' ? 'INFO' : 'WARN',
|
46
|
+
message: data.line,
|
47
|
+
});
|
48
|
+
});
|
49
|
+
if (child.process.stdout) {
|
50
|
+
child.process.stdout.on('data', (data) => {
|
51
|
+
chunks.push(data);
|
52
|
+
});
|
53
|
+
}
|
54
|
+
child.process.on('exit', (exit, signal) => {
|
55
|
+
if (exit !== 0) {
|
56
|
+
this.warn(`Command "${command}" failed: ${exit}`);
|
57
|
+
reject(new Error(`Command "${command}" exited with code ${exit}`));
|
58
|
+
}
|
59
|
+
else {
|
60
|
+
this.info(`Command OK: "${command}"`);
|
61
|
+
resolve({ exit, signal, output: Buffer.concat(chunks).toString() });
|
62
|
+
}
|
63
|
+
});
|
64
|
+
child.process.on('error', (err) => {
|
65
|
+
this.warn(`"${command}" failed: "${err.message}"`);
|
66
|
+
reject(err);
|
67
|
+
});
|
68
|
+
await child.wait();
|
69
|
+
}
|
70
|
+
catch (e) {
|
71
|
+
reject(e);
|
72
|
+
}
|
73
|
+
});
|
74
|
+
}
|
75
|
+
async progress(label, callback) {
|
76
|
+
this.info(`${label}: started`);
|
77
|
+
try {
|
78
|
+
const result = await callback();
|
79
|
+
this.info(`${label}: done`);
|
80
|
+
return result;
|
81
|
+
}
|
82
|
+
catch (e) {
|
83
|
+
this.warn(`${label}: failed. ${e.message}`);
|
84
|
+
throw e;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
async check(message, ok) {
|
88
|
+
const wasOk = await ok;
|
89
|
+
this.info(`${message}: ${wasOk}`);
|
90
|
+
}
|
91
|
+
start(label) {
|
92
|
+
this.info(label);
|
93
|
+
}
|
94
|
+
showValue(label, value) {
|
95
|
+
this.info(`${label}: ${value}`);
|
96
|
+
}
|
97
|
+
error(msg, ...args) {
|
98
|
+
this.emitLog({
|
99
|
+
message: (0, node_util_1.format)(msg, args),
|
100
|
+
level: 'ERROR',
|
101
|
+
});
|
102
|
+
}
|
103
|
+
warn(msg, ...args) {
|
104
|
+
this.emitLog({
|
105
|
+
message: (0, node_util_1.format)(msg, args),
|
106
|
+
level: 'WARN',
|
107
|
+
});
|
108
|
+
}
|
109
|
+
info(msg, ...args) {
|
110
|
+
this.emitLog({
|
111
|
+
message: (0, node_util_1.format)(msg, args),
|
112
|
+
level: 'INFO',
|
113
|
+
});
|
114
|
+
}
|
115
|
+
debug(msg, ...args) {
|
116
|
+
this.emitLog({
|
117
|
+
message: (0, node_util_1.format)(msg, args),
|
118
|
+
level: 'DEBUG',
|
119
|
+
});
|
120
|
+
}
|
121
|
+
}
|
122
|
+
exports.ProgressListener = ProgressListener;
|
123
|
+
class TaskProgressListener extends ProgressListener {
|
124
|
+
task;
|
125
|
+
constructor(task) {
|
126
|
+
super();
|
127
|
+
this.task = task;
|
128
|
+
}
|
129
|
+
emitLog(payload) {
|
130
|
+
this.task.addLog(payload.message, payload.level);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
exports.TaskProgressListener = TaskProgressListener;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
import { DefinitionInfo } from '@kapeta/local-cluster-config';
|
6
|
+
declare class ProviderManager {
|
7
|
+
getWebProviders(): Promise<DefinitionInfo[]>;
|
8
|
+
getProviderWebJS(handle: string, name: string, version: string, sourceMap?: boolean): Promise<unknown>;
|
9
|
+
}
|
10
|
+
export declare const providerManager: ProviderManager;
|
11
|
+
export {};
|
@@ -0,0 +1,84 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Copyright 2023 Kapeta Inc.
|
4
|
+
* SPDX-License-Identifier: BUSL-1.1
|
5
|
+
*/
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
8
|
+
};
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
exports.providerManager = void 0;
|
11
|
+
const path_1 = __importDefault(require("path"));
|
12
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
13
|
+
const definitionsManager_1 = require("./definitionsManager");
|
14
|
+
const cacheManager_1 = require("./cacheManager");
|
15
|
+
const request_1 = __importDefault(require("request"));
|
16
|
+
const PROVIDER_FILE_BASE = 'https://providers.kapeta.com/files';
|
17
|
+
class ProviderManager {
|
18
|
+
async getWebProviders() {
|
19
|
+
const providers = await definitionsManager_1.definitionsManager.getProviderDefinitions();
|
20
|
+
return providers.filter((providerDefinition) => providerDefinition.hasWeb);
|
21
|
+
}
|
22
|
+
async getProviderWebJS(handle, name, version, sourceMap = false) {
|
23
|
+
const fullName = `${handle}/${name}`;
|
24
|
+
const id = `${handle}/${name}/${version}/web.js${sourceMap ? '.map' : ''}`;
|
25
|
+
const cacheKey = `provider:web:${id}`;
|
26
|
+
const file = cacheManager_1.cacheManager.get(cacheKey);
|
27
|
+
if (file && (await fs_extra_1.default.pathExists(file))) {
|
28
|
+
return fs_extra_1.default.readFile(file, 'utf8');
|
29
|
+
}
|
30
|
+
const providers = await this.getWebProviders();
|
31
|
+
const installedProvider = providers.find((providerDefinition) => {
|
32
|
+
return providerDefinition.definition.metadata.name === fullName && providerDefinition.version === version;
|
33
|
+
});
|
34
|
+
if (installedProvider) {
|
35
|
+
//Check locally installed providers
|
36
|
+
const path = path_1.default.join(installedProvider.path, 'web', handle, `${name}.js${sourceMap ? '.map' : ''}`);
|
37
|
+
if (await fs_extra_1.default.pathExists(path)) {
|
38
|
+
cacheManager_1.cacheManager.set(cacheKey, path, 24 * 60 * 60 * 1000);
|
39
|
+
return fs_extra_1.default.readFile(path);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
if (version === 'local') {
|
43
|
+
return null;
|
44
|
+
}
|
45
|
+
const url = `${PROVIDER_FILE_BASE}/${id}`;
|
46
|
+
return new Promise((resolve, reject) => {
|
47
|
+
console.log('Loading provider from %s', url);
|
48
|
+
request_1.default.get(url, (error, response, body) => {
|
49
|
+
if (error) {
|
50
|
+
reject(error);
|
51
|
+
return;
|
52
|
+
}
|
53
|
+
if (response.statusCode === 404) {
|
54
|
+
resolve(null);
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
if (response.statusCode !== 200) {
|
58
|
+
reject(new Error(`Failed to load provider from ${url}: ${body}`));
|
59
|
+
return;
|
60
|
+
}
|
61
|
+
resolve(body);
|
62
|
+
});
|
63
|
+
});
|
64
|
+
}
|
65
|
+
}
|
66
|
+
definitionsManager_1.definitionsManager
|
67
|
+
.getProviderDefinitions()
|
68
|
+
.then((providerDefinitions) => {
|
69
|
+
if (providerDefinitions.length > 0) {
|
70
|
+
console.log('## Loaded the following providers ##');
|
71
|
+
providerDefinitions.forEach((providerDefinition) => {
|
72
|
+
console.log(' - %s[%s:%s]', providerDefinition.definition.kind, providerDefinition.definition.metadata.name, providerDefinition.version);
|
73
|
+
console.log(' from %s', providerDefinition.path);
|
74
|
+
});
|
75
|
+
console.log('##');
|
76
|
+
}
|
77
|
+
else {
|
78
|
+
console.log('## No providers found ##');
|
79
|
+
}
|
80
|
+
})
|
81
|
+
.catch((e) => {
|
82
|
+
console.error('Failed to load providers', e);
|
83
|
+
});
|
84
|
+
exports.providerManager = new ProviderManager();
|
@@ -0,0 +1,46 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Copyright 2023 Kapeta Inc.
|
4
|
+
* SPDX-License-Identifier: BUSL-1.1
|
5
|
+
*/
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
8
|
+
};
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
const express_promise_router_1 = __importDefault(require("express-promise-router"));
|
11
|
+
const providerManager_1 = require("../providerManager");
|
12
|
+
const cors_1 = require("../middleware/cors");
|
13
|
+
const router = (0, express_promise_router_1.default)();
|
14
|
+
router.use('/', cors_1.corsHandler);
|
15
|
+
router.get('/', async (req, res) => {
|
16
|
+
const result = await providerManager_1.providerManager.getWebProviders();
|
17
|
+
res.send(result);
|
18
|
+
});
|
19
|
+
router.get('/asset/:handle/:name/:version/web.js', async (req, res) => {
|
20
|
+
const { handle, name, version } = req.params;
|
21
|
+
let result = await providerManager_1.providerManager.getProviderWebJS(handle, name, version);
|
22
|
+
if (!result) {
|
23
|
+
res.status(404).send('');
|
24
|
+
}
|
25
|
+
else {
|
26
|
+
if (version !== 'local') {
|
27
|
+
res.setHeader('Cache-Control', 'max-age=31536000, immutable');
|
28
|
+
}
|
29
|
+
res.send(result.toString().replace(`${name}.js.map`, 'web.js.map'));
|
30
|
+
}
|
31
|
+
});
|
32
|
+
router.get('/asset/:handle/:name/:version/web.js.map', async (req, res) => {
|
33
|
+
const { handle, name, version } = req.params;
|
34
|
+
const result = await providerManager_1.providerManager.getProviderWebJS(handle, name, version, true);
|
35
|
+
if (!result) {
|
36
|
+
res.status(404).send('');
|
37
|
+
}
|
38
|
+
else {
|
39
|
+
// Only cache successful requests
|
40
|
+
if (version !== 'local') {
|
41
|
+
res.setHeader('Cache-Control', 'max-age=31536000, immutable');
|
42
|
+
}
|
43
|
+
res.send(result);
|
44
|
+
}
|
45
|
+
});
|
46
|
+
exports.default = router;
|
@@ -0,0 +1,115 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Copyright 2023 Kapeta Inc.
|
4
|
+
* SPDX-License-Identifier: BUSL-1.1
|
5
|
+
*/
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
8
|
+
};
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
const express_promise_router_1 = __importDefault(require("express-promise-router"));
|
11
|
+
const rest_1 = require("./types/rest");
|
12
|
+
const web_1 = require("./types/web");
|
13
|
+
const stringBody_1 = require("../middleware/stringBody");
|
14
|
+
const serviceManager_1 = require("../serviceManager");
|
15
|
+
const clusterService_1 = require("../clusterService");
|
16
|
+
const assetManager_1 = require("../assetManager");
|
17
|
+
const lodash_1 = __importDefault(require("lodash"));
|
18
|
+
const router = (0, express_promise_router_1.default)();
|
19
|
+
/**
|
20
|
+
* @var {{[key:string]:ProxyRequestHandler}}
|
21
|
+
*/
|
22
|
+
const TYPE_HANDLERS = {
|
23
|
+
rest: rest_1.proxyRestRequest,
|
24
|
+
http: web_1.proxyHttpRequest,
|
25
|
+
};
|
26
|
+
function getResource(resources, resourceName) {
|
27
|
+
return resources.find((resource) => {
|
28
|
+
return resource.metadata.name.toLowerCase() === resourceName.toLowerCase();
|
29
|
+
});
|
30
|
+
}
|
31
|
+
router.use('/:systemId/:consumerInstanceId/:consumerResourceName', stringBody_1.stringBody);
|
32
|
+
router.all('/:systemId/:consumerInstanceId/:consumerResourceName/:type/*', async (req, res) => {
|
33
|
+
try {
|
34
|
+
let typeHandler = TYPE_HANDLERS[req.params.type.toLowerCase()];
|
35
|
+
if (!typeHandler) {
|
36
|
+
// Default to http
|
37
|
+
typeHandler = TYPE_HANDLERS['http'];
|
38
|
+
}
|
39
|
+
const plan = await assetManager_1.assetManager.getPlan(req.params.systemId);
|
40
|
+
// We can find the connection by the consumer information alone since
|
41
|
+
// only 1 provider can be connected to a consumer resource at a time
|
42
|
+
const connection = plan.spec.connections.find((connection) => {
|
43
|
+
return (connection.consumer.blockId.toLowerCase() === req.params.consumerInstanceId.toLowerCase() &&
|
44
|
+
connection.consumer.resourceName.toLowerCase() === req.params.consumerResourceName.toLowerCase());
|
45
|
+
});
|
46
|
+
if (!connection) {
|
47
|
+
res.status(401).send({
|
48
|
+
error: `No connection found for consumer "${req.params.consumerInstanceId}::${req.params.consumerResourceName}"`,
|
49
|
+
});
|
50
|
+
return;
|
51
|
+
}
|
52
|
+
const toBlockInstance = lodash_1.default.find(plan.spec.blocks, (blockInstance) => {
|
53
|
+
return blockInstance.id.toLowerCase() === connection.consumer.blockId.toLowerCase();
|
54
|
+
});
|
55
|
+
if (!toBlockInstance) {
|
56
|
+
res.status(401).send({ error: `Block instance not found "${req.params.consumerInstanceId}` });
|
57
|
+
return;
|
58
|
+
}
|
59
|
+
const toBlockAsset = await assetManager_1.assetManager.getAsset(toBlockInstance.block.ref);
|
60
|
+
if (!toBlockAsset) {
|
61
|
+
res.status(401).send({ error: `Block asset not found "${toBlockInstance.block.ref}` });
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
const consumerResource = getResource(toBlockAsset.data.spec.consumers, req.params.consumerResourceName);
|
65
|
+
if (!consumerResource) {
|
66
|
+
res.status(401).send({
|
67
|
+
error: `Block resource not found "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`,
|
68
|
+
});
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
const basePath = clusterService_1.clusterService.getProxyPath(req.params.systemId, req.params.consumerInstanceId, req.params.consumerResourceName, req.params.type);
|
72
|
+
const fromBlockInstance = lodash_1.default.find(plan.spec.blocks, (blockInstance) => {
|
73
|
+
return blockInstance.id.toLowerCase() === connection.provider.blockId.toLowerCase();
|
74
|
+
});
|
75
|
+
if (!fromBlockInstance) {
|
76
|
+
res.status(401).send({ error: `Block instance not found "${connection.provider.blockId}` });
|
77
|
+
return;
|
78
|
+
}
|
79
|
+
const fromBlockAsset = await assetManager_1.assetManager.getAsset(fromBlockInstance.block.ref);
|
80
|
+
if (!fromBlockAsset) {
|
81
|
+
res.status(401).send({ error: `Block asset not found "${fromBlockInstance.block.ref}` });
|
82
|
+
return;
|
83
|
+
}
|
84
|
+
const providerResource = getResource(fromBlockAsset.data.spec.providers, connection.provider.resourceName);
|
85
|
+
if (!providerResource) {
|
86
|
+
res.status(401).send({
|
87
|
+
error: `Block resource not found "${connection.provider.blockId}::${connection.provider.resourceName}`,
|
88
|
+
});
|
89
|
+
return;
|
90
|
+
}
|
91
|
+
//Get target address
|
92
|
+
let address = await serviceManager_1.serviceManager.getProviderAddress(req.params.systemId, connection.provider.blockId, req.params.type);
|
93
|
+
while (address.endsWith('/')) {
|
94
|
+
address = address.substring(0, address.length - 1);
|
95
|
+
}
|
96
|
+
/*
|
97
|
+
Get the path the consumer requested.
|
98
|
+
Note that this might not match the path the destination is expecting so we need to identify the method
|
99
|
+
that is being called and identify the destination path from the connection.
|
100
|
+
*/
|
101
|
+
const consumerPath = req.originalUrl.substring(basePath.length - 1);
|
102
|
+
typeHandler(req, res, {
|
103
|
+
consumerPath,
|
104
|
+
address,
|
105
|
+
consumerResource,
|
106
|
+
providerResource,
|
107
|
+
connection,
|
108
|
+
});
|
109
|
+
}
|
110
|
+
catch (err) {
|
111
|
+
console.warn('Failed to process proxy request', err);
|
112
|
+
res.status(400).send({ error: err.message });
|
113
|
+
}
|
114
|
+
});
|
115
|
+
exports.default = router;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
import { Response } from 'express';
|
6
|
+
import { ProxyRequestInfo } from '../../types';
|
7
|
+
import { StringBodyRequest } from '../../middleware/stringBody';
|
8
|
+
import { Resource } from '@kapeta/schemas';
|
9
|
+
export declare function getRestMethodId(restResource: Resource, httpMethod: string, httpPath: string): string | undefined;
|
10
|
+
export declare function proxyRestRequest(req: StringBodyRequest, res: Response, opts: ProxyRequestInfo): void;
|