@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.
Files changed (274) hide show
  1. package/.eslintrc.cjs +25 -0
  2. package/.github/workflows/check-license.yml +17 -0
  3. package/.github/workflows/main.yml +26 -0
  4. package/.prettierignore +4 -0
  5. package/.vscode/launch.json +19 -0
  6. package/CHANGELOG.md +920 -0
  7. package/LICENSE +38 -0
  8. package/README.md +36 -0
  9. package/definitions.d.ts +35 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.js +263 -0
  12. package/dist/cjs/package.json +1 -0
  13. package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
  14. package/dist/cjs/src/RepositoryWatcher.js +332 -0
  15. package/dist/cjs/src/ai/aiClient.d.ts +20 -0
  16. package/dist/cjs/src/ai/aiClient.js +74 -0
  17. package/dist/cjs/src/ai/routes.d.ts +7 -0
  18. package/dist/cjs/src/ai/routes.js +37 -0
  19. package/dist/cjs/src/ai/transform.d.ts +11 -0
  20. package/dist/cjs/src/ai/transform.js +239 -0
  21. package/dist/cjs/src/ai/types.d.ts +40 -0
  22. package/dist/cjs/src/ai/types.js +2 -0
  23. package/dist/cjs/src/api.d.ts +7 -0
  24. package/dist/cjs/src/api.js +29 -0
  25. package/dist/cjs/src/assetManager.d.ts +41 -0
  26. package/dist/cjs/src/assetManager.js +274 -0
  27. package/dist/cjs/src/assets/routes.d.ts +7 -0
  28. package/dist/cjs/src/assets/routes.js +165 -0
  29. package/dist/cjs/src/attachments/routes.d.ts +7 -0
  30. package/dist/cjs/src/attachments/routes.js +72 -0
  31. package/dist/cjs/src/authManager.d.ts +16 -0
  32. package/dist/cjs/src/authManager.js +64 -0
  33. package/dist/cjs/src/cacheManager.d.ts +20 -0
  34. package/dist/cjs/src/cacheManager.js +51 -0
  35. package/dist/cjs/src/clusterService.d.ts +44 -0
  36. package/dist/cjs/src/clusterService.js +120 -0
  37. package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
  38. package/dist/cjs/src/codeGeneratorManager.js +93 -0
  39. package/dist/cjs/src/config/routes.d.ts +7 -0
  40. package/dist/cjs/src/config/routes.js +160 -0
  41. package/dist/cjs/src/configManager.d.ts +42 -0
  42. package/dist/cjs/src/configManager.js +136 -0
  43. package/dist/cjs/src/containerManager.d.ts +148 -0
  44. package/dist/cjs/src/containerManager.js +958 -0
  45. package/dist/cjs/src/definitionsManager.d.ts +20 -0
  46. package/dist/cjs/src/definitionsManager.js +171 -0
  47. package/dist/cjs/src/filesystem/routes.d.ts +7 -0
  48. package/dist/cjs/src/filesystem/routes.js +105 -0
  49. package/dist/cjs/src/filesystemManager.d.ts +27 -0
  50. package/dist/cjs/src/filesystemManager.js +118 -0
  51. package/dist/cjs/src/identities/routes.d.ts +7 -0
  52. package/dist/cjs/src/identities/routes.js +37 -0
  53. package/dist/cjs/src/instanceManager.d.ts +69 -0
  54. package/dist/cjs/src/instanceManager.js +910 -0
  55. package/dist/cjs/src/instances/routes.d.ts +7 -0
  56. package/dist/cjs/src/instances/routes.js +179 -0
  57. package/dist/cjs/src/middleware/cors.d.ts +6 -0
  58. package/dist/cjs/src/middleware/cors.js +14 -0
  59. package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
  60. package/dist/cjs/src/middleware/kapeta.js +28 -0
  61. package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
  62. package/dist/cjs/src/middleware/stringBody.js +18 -0
  63. package/dist/cjs/src/networkManager.d.ts +37 -0
  64. package/dist/cjs/src/networkManager.js +119 -0
  65. package/dist/cjs/src/operatorManager.d.ts +41 -0
  66. package/dist/cjs/src/operatorManager.js +211 -0
  67. package/dist/cjs/src/progressListener.d.ts +31 -0
  68. package/dist/cjs/src/progressListener.js +133 -0
  69. package/dist/cjs/src/providerManager.d.ts +11 -0
  70. package/dist/cjs/src/providerManager.js +84 -0
  71. package/dist/cjs/src/providers/routes.d.ts +7 -0
  72. package/dist/cjs/src/providers/routes.js +46 -0
  73. package/dist/cjs/src/proxy/routes.d.ts +7 -0
  74. package/dist/cjs/src/proxy/routes.js +115 -0
  75. package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
  76. package/dist/cjs/src/proxy/types/rest.js +123 -0
  77. package/dist/cjs/src/proxy/types/web.d.ts +8 -0
  78. package/dist/cjs/src/proxy/types/web.js +61 -0
  79. package/dist/cjs/src/repositoryManager.d.ts +35 -0
  80. package/dist/cjs/src/repositoryManager.js +247 -0
  81. package/dist/cjs/src/serviceManager.d.ts +36 -0
  82. package/dist/cjs/src/serviceManager.js +106 -0
  83. package/dist/cjs/src/socketManager.d.ts +32 -0
  84. package/dist/cjs/src/socketManager.js +125 -0
  85. package/dist/cjs/src/storageService.d.ts +21 -0
  86. package/dist/cjs/src/storageService.js +81 -0
  87. package/dist/cjs/src/taskManager.d.ts +70 -0
  88. package/dist/cjs/src/taskManager.js +181 -0
  89. package/dist/cjs/src/tasks/routes.d.ts +7 -0
  90. package/dist/cjs/src/tasks/routes.js +39 -0
  91. package/dist/cjs/src/traffic/routes.d.ts +7 -0
  92. package/dist/cjs/src/traffic/routes.js +22 -0
  93. package/dist/cjs/src/types.d.ts +99 -0
  94. package/dist/cjs/src/types.js +39 -0
  95. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
  96. package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
  97. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
  98. package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
  99. package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
  100. package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
  101. package/dist/cjs/src/utils/LogData.d.ts +23 -0
  102. package/dist/cjs/src/utils/LogData.js +46 -0
  103. package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
  104. package/dist/cjs/src/utils/commandLineUtils.js +39 -0
  105. package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
  106. package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
  107. package/dist/cjs/src/utils/utils.d.ts +40 -0
  108. package/dist/cjs/src/utils/utils.js +148 -0
  109. package/dist/cjs/start.d.ts +5 -0
  110. package/dist/cjs/start.js +17 -0
  111. package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
  112. package/dist/cjs/test/proxy/types/rest.test.js +48 -0
  113. package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
  114. package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
  115. package/dist/esm/index.d.ts +34 -0
  116. package/dist/esm/index.js +263 -0
  117. package/dist/esm/package.json +1 -0
  118. package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
  119. package/dist/esm/src/RepositoryWatcher.js +332 -0
  120. package/dist/esm/src/ai/aiClient.d.ts +20 -0
  121. package/dist/esm/src/ai/aiClient.js +74 -0
  122. package/dist/esm/src/ai/routes.d.ts +7 -0
  123. package/dist/esm/src/ai/routes.js +37 -0
  124. package/dist/esm/src/ai/transform.d.ts +11 -0
  125. package/dist/esm/src/ai/transform.js +239 -0
  126. package/dist/esm/src/ai/types.d.ts +40 -0
  127. package/dist/esm/src/ai/types.js +2 -0
  128. package/dist/esm/src/api.d.ts +7 -0
  129. package/dist/esm/src/api.js +29 -0
  130. package/dist/esm/src/assetManager.d.ts +41 -0
  131. package/dist/esm/src/assetManager.js +274 -0
  132. package/dist/esm/src/assets/routes.d.ts +7 -0
  133. package/dist/esm/src/assets/routes.js +165 -0
  134. package/dist/esm/src/attachments/routes.d.ts +7 -0
  135. package/dist/esm/src/attachments/routes.js +72 -0
  136. package/dist/esm/src/authManager.d.ts +16 -0
  137. package/dist/esm/src/authManager.js +64 -0
  138. package/dist/esm/src/cacheManager.d.ts +20 -0
  139. package/dist/esm/src/cacheManager.js +51 -0
  140. package/dist/esm/src/clusterService.d.ts +44 -0
  141. package/dist/esm/src/clusterService.js +120 -0
  142. package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
  143. package/dist/esm/src/codeGeneratorManager.js +93 -0
  144. package/dist/esm/src/config/routes.d.ts +7 -0
  145. package/dist/esm/src/config/routes.js +160 -0
  146. package/dist/esm/src/configManager.d.ts +42 -0
  147. package/dist/esm/src/configManager.js +136 -0
  148. package/dist/esm/src/containerManager.d.ts +148 -0
  149. package/dist/esm/src/containerManager.js +958 -0
  150. package/dist/esm/src/definitionsManager.d.ts +20 -0
  151. package/dist/esm/src/definitionsManager.js +171 -0
  152. package/dist/esm/src/filesystem/routes.d.ts +7 -0
  153. package/dist/esm/src/filesystem/routes.js +105 -0
  154. package/dist/esm/src/filesystemManager.d.ts +27 -0
  155. package/dist/esm/src/filesystemManager.js +118 -0
  156. package/dist/esm/src/identities/routes.d.ts +7 -0
  157. package/dist/esm/src/identities/routes.js +37 -0
  158. package/dist/esm/src/instanceManager.d.ts +69 -0
  159. package/dist/esm/src/instanceManager.js +910 -0
  160. package/dist/esm/src/instances/routes.d.ts +7 -0
  161. package/dist/esm/src/instances/routes.js +179 -0
  162. package/dist/esm/src/middleware/cors.d.ts +6 -0
  163. package/dist/esm/src/middleware/cors.js +14 -0
  164. package/dist/esm/src/middleware/kapeta.d.ts +15 -0
  165. package/dist/esm/src/middleware/kapeta.js +28 -0
  166. package/dist/esm/src/middleware/stringBody.d.ts +9 -0
  167. package/dist/esm/src/middleware/stringBody.js +18 -0
  168. package/dist/esm/src/networkManager.d.ts +37 -0
  169. package/dist/esm/src/networkManager.js +119 -0
  170. package/dist/esm/src/operatorManager.d.ts +41 -0
  171. package/dist/esm/src/operatorManager.js +211 -0
  172. package/dist/esm/src/progressListener.d.ts +31 -0
  173. package/dist/esm/src/progressListener.js +133 -0
  174. package/dist/esm/src/providerManager.d.ts +11 -0
  175. package/dist/esm/src/providerManager.js +84 -0
  176. package/dist/esm/src/providers/routes.d.ts +7 -0
  177. package/dist/esm/src/providers/routes.js +46 -0
  178. package/dist/esm/src/proxy/routes.d.ts +7 -0
  179. package/dist/esm/src/proxy/routes.js +115 -0
  180. package/dist/esm/src/proxy/types/rest.d.ts +10 -0
  181. package/dist/esm/src/proxy/types/rest.js +123 -0
  182. package/dist/esm/src/proxy/types/web.d.ts +8 -0
  183. package/dist/esm/src/proxy/types/web.js +61 -0
  184. package/dist/esm/src/repositoryManager.d.ts +35 -0
  185. package/dist/esm/src/repositoryManager.js +247 -0
  186. package/dist/esm/src/serviceManager.d.ts +36 -0
  187. package/dist/esm/src/serviceManager.js +106 -0
  188. package/dist/esm/src/socketManager.d.ts +32 -0
  189. package/dist/esm/src/socketManager.js +125 -0
  190. package/dist/esm/src/storageService.d.ts +21 -0
  191. package/dist/esm/src/storageService.js +81 -0
  192. package/dist/esm/src/taskManager.d.ts +70 -0
  193. package/dist/esm/src/taskManager.js +181 -0
  194. package/dist/esm/src/tasks/routes.d.ts +7 -0
  195. package/dist/esm/src/tasks/routes.js +39 -0
  196. package/dist/esm/src/traffic/routes.d.ts +7 -0
  197. package/dist/esm/src/traffic/routes.js +22 -0
  198. package/dist/esm/src/types.d.ts +99 -0
  199. package/dist/esm/src/types.js +39 -0
  200. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
  201. package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
  202. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
  203. package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
  204. package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
  205. package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
  206. package/dist/esm/src/utils/LogData.d.ts +23 -0
  207. package/dist/esm/src/utils/LogData.js +46 -0
  208. package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
  209. package/dist/esm/src/utils/commandLineUtils.js +39 -0
  210. package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
  211. package/dist/esm/src/utils/pathTemplateParser.js +135 -0
  212. package/dist/esm/src/utils/utils.d.ts +40 -0
  213. package/dist/esm/src/utils/utils.js +148 -0
  214. package/dist/esm/start.d.ts +5 -0
  215. package/dist/esm/start.js +17 -0
  216. package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
  217. package/dist/esm/test/proxy/types/rest.test.js +48 -0
  218. package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
  219. package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
  220. package/index.ts +280 -0
  221. package/jest.config.js +8 -0
  222. package/package.json +134 -0
  223. package/src/RepositoryWatcher.ts +363 -0
  224. package/src/ai/aiClient.ts +93 -0
  225. package/src/ai/routes.ts +39 -0
  226. package/src/ai/transform.ts +275 -0
  227. package/src/ai/types.ts +45 -0
  228. package/src/api.ts +32 -0
  229. package/src/assetManager.ts +355 -0
  230. package/src/assets/routes.ts +183 -0
  231. package/src/attachments/routes.ts +79 -0
  232. package/src/authManager.ts +67 -0
  233. package/src/cacheManager.ts +59 -0
  234. package/src/clusterService.ts +142 -0
  235. package/src/codeGeneratorManager.ts +109 -0
  236. package/src/config/routes.ts +201 -0
  237. package/src/configManager.ts +180 -0
  238. package/src/containerManager.ts +1178 -0
  239. package/src/definitionsManager.ts +212 -0
  240. package/src/filesystem/routes.ts +123 -0
  241. package/src/filesystemManager.ts +133 -0
  242. package/src/identities/routes.ts +38 -0
  243. package/src/instanceManager.ts +1160 -0
  244. package/src/instances/routes.ts +203 -0
  245. package/src/middleware/cors.ts +14 -0
  246. package/src/middleware/kapeta.ts +41 -0
  247. package/src/middleware/stringBody.ts +21 -0
  248. package/src/networkManager.ts +148 -0
  249. package/src/operatorManager.ts +294 -0
  250. package/src/progressListener.ts +151 -0
  251. package/src/providerManager.ts +97 -0
  252. package/src/providers/routes.ts +51 -0
  253. package/src/proxy/routes.ts +153 -0
  254. package/src/proxy/types/rest.ts +172 -0
  255. package/src/proxy/types/web.ts +70 -0
  256. package/src/repositoryManager.ts +291 -0
  257. package/src/serviceManager.ts +133 -0
  258. package/src/socketManager.ts +138 -0
  259. package/src/storageService.ts +97 -0
  260. package/src/taskManager.ts +247 -0
  261. package/src/tasks/routes.ts +43 -0
  262. package/src/traffic/routes.ts +23 -0
  263. package/src/types.ts +112 -0
  264. package/src/utils/BlockInstanceRunner.ts +577 -0
  265. package/src/utils/DefaultProviderInstaller.ts +150 -0
  266. package/src/utils/InternalConfigProvider.ts +214 -0
  267. package/src/utils/LogData.ts +50 -0
  268. package/src/utils/commandLineUtils.ts +45 -0
  269. package/src/utils/pathTemplateParser.ts +157 -0
  270. package/src/utils/utils.ts +155 -0
  271. package/start.ts +14 -0
  272. package/test/proxy/types/rest.test.ts +54 -0
  273. package/test/utils/pathTemplateParser.test.ts +29 -0
  274. package/tsconfig.json +15 -0
@@ -0,0 +1,123 @@
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.proxyRestRequest = exports.getRestMethodId = void 0;
11
+ const lodash_1 = __importDefault(require("lodash"));
12
+ const request_1 = __importDefault(require("request"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const pathTemplateParser_1 = require("../../utils/pathTemplateParser");
15
+ const networkManager_1 = require("../../networkManager");
16
+ const socketManager_1 = require("../../socketManager");
17
+ const qs_1 = require("qs");
18
+ function getRestMethodId(restResource, httpMethod, httpPath) {
19
+ return lodash_1.default.findKey(restResource.spec.methods, (method) => {
20
+ let methodType = method.method ? method.method.toUpperCase() : 'GET';
21
+ if (methodType.toUpperCase() !== httpMethod.toUpperCase()) {
22
+ return false;
23
+ }
24
+ let path = method.path;
25
+ if (restResource.spec.basePath) {
26
+ path = path_1.default.join(restResource.spec.basePath, path);
27
+ }
28
+ const pathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(path);
29
+ return pathTemplate.matches(httpPath);
30
+ });
31
+ }
32
+ exports.getRestMethodId = getRestMethodId;
33
+ /**
34
+ *
35
+ * @param req {Request}
36
+ * @param opts {ProxyRequestInfo}
37
+ * @return {{consumerMethod: *, providerMethod: *}}
38
+ */
39
+ function resolveMethods(req, opts) {
40
+ const consumerMethodId = getRestMethodId(opts.consumerResource, req.method, opts.consumerPath);
41
+ if (!consumerMethodId) {
42
+ throw new Error(`Consumer method not found for path "${req.method} ${opts.consumerPath}" in resource "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`);
43
+ }
44
+ const consumerMethod = lodash_1.default.cloneDeep(opts.consumerResource.spec.methods[consumerMethodId]);
45
+ if (!consumerMethod) {
46
+ throw new Error(`Consumer method not found for path "${req.method} ${opts.consumerPath}" in resource "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`);
47
+ }
48
+ consumerMethod.id = consumerMethodId;
49
+ const providerMethodId = lodash_1.default.findKey(opts.connection.mapping, (mapping) => {
50
+ return mapping.targetId === consumerMethodId;
51
+ });
52
+ if (!providerMethodId) {
53
+ throw new Error(`Connection contained no mapping for consumer method "${consumerMethodId}`);
54
+ }
55
+ const providerMethod = lodash_1.default.cloneDeep(opts.providerResource.spec.methods[providerMethodId]);
56
+ if (!providerMethod) {
57
+ throw new Error(`Provider method not found "${providerMethodId}" in resource "${opts.connection.provider.blockId}::${opts.connection.provider.resourceName}`);
58
+ }
59
+ providerMethod.id = providerMethodId;
60
+ return {
61
+ consumerMethod,
62
+ providerMethod,
63
+ };
64
+ }
65
+ function proxyRestRequest(req, res, opts) {
66
+ let { consumerMethod, providerMethod } = resolveMethods(req, opts);
67
+ const consumerPathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(consumerMethod.path);
68
+ const providerPathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(providerMethod.path);
69
+ const pathVariables = consumerPathTemplate.parse(opts.consumerPath);
70
+ if (!pathVariables) {
71
+ res.status(400).send({
72
+ error: `Path did not match any patterns: "${opts.consumerPath}"`,
73
+ });
74
+ return;
75
+ }
76
+ let providerPath = providerPathTemplate.create(pathVariables);
77
+ if (!providerPath.startsWith('/')) {
78
+ providerPath = '/' + providerPath;
79
+ }
80
+ if (!lodash_1.default.isEmpty(req.query)) {
81
+ providerPath += '?' + (0, qs_1.stringify)(req.query, { arrayFormat: 'repeat' });
82
+ }
83
+ const requestHeaders = lodash_1.default.clone(req.headers);
84
+ delete requestHeaders['content-length'];
85
+ delete requestHeaders['content-encoding'];
86
+ delete requestHeaders['connection'];
87
+ delete requestHeaders['host'];
88
+ delete requestHeaders['origin'];
89
+ console.log('Proxy request to provider: %s => %s [rest]', opts.consumerPath, opts.address + providerPath);
90
+ const reqOpts = {
91
+ method: providerMethod.method || 'GET',
92
+ url: opts.address + providerPath,
93
+ body: req.stringBody,
94
+ headers: requestHeaders,
95
+ };
96
+ const traffic = networkManager_1.networkManager.addRequest(req.params.systemId, opts.connection, reqOpts, consumerMethod.id, providerMethod.id);
97
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_start', traffic);
98
+ (0, request_1.default)(reqOpts, function (err, response, responseBody) {
99
+ if (err) {
100
+ traffic.asError(err);
101
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
102
+ res.status(500).send({ error: '' + err });
103
+ return;
104
+ }
105
+ const responseHeaders = lodash_1.default.clone(response.headers);
106
+ delete responseHeaders['content-length'];
107
+ delete responseHeaders['content-encoding'];
108
+ delete responseHeaders['connection'];
109
+ res.set(responseHeaders);
110
+ res.status(response.statusCode);
111
+ traffic.withResponse({
112
+ code: response.statusCode,
113
+ headers: response.headers,
114
+ body: responseBody,
115
+ });
116
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
117
+ if (responseBody) {
118
+ res.write(responseBody);
119
+ }
120
+ res.end();
121
+ });
122
+ }
123
+ exports.proxyRestRequest = proxyRestRequest;
@@ -0,0 +1,8 @@
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
+ export declare function proxyHttpRequest(req: StringBodyRequest, res: Response, opts: ProxyRequestInfo): void;
@@ -0,0 +1,61 @@
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.proxyHttpRequest = void 0;
11
+ const request_1 = __importDefault(require("request"));
12
+ const lodash_1 = __importDefault(require("lodash"));
13
+ const networkManager_1 = require("../../networkManager");
14
+ const socketManager_1 = require("../../socketManager");
15
+ const qs_1 = require("qs");
16
+ function proxyHttpRequest(req, res, opts) {
17
+ const requestHeaders = lodash_1.default.clone(req.headers);
18
+ delete requestHeaders['content-length'];
19
+ delete requestHeaders['content-encoding'];
20
+ delete requestHeaders['connection'];
21
+ delete requestHeaders['host'];
22
+ delete requestHeaders['origin'];
23
+ const sourceBasePath = opts.consumerResource.spec.path;
24
+ const targetBasePath = opts.providerResource.spec.path;
25
+ let path = opts.consumerPath;
26
+ if (opts.consumerPath.startsWith(sourceBasePath)) {
27
+ path = path.replace(sourceBasePath, targetBasePath);
28
+ }
29
+ if (!lodash_1.default.isEmpty(req.query)) {
30
+ path += '?' + (0, qs_1.stringify)(req.query, { arrayFormat: 'repeat' });
31
+ }
32
+ console.log('Proxy request to provider: %s => %s%s [http]', opts.consumerPath, opts.address, path);
33
+ const reqOpts = {
34
+ method: req.method,
35
+ url: opts.address + path,
36
+ headers: requestHeaders,
37
+ body: req.stringBody,
38
+ };
39
+ const traffic = networkManager_1.networkManager.addRequest(req.params.systemId, opts.connection, reqOpts);
40
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_start', traffic);
41
+ const proxyReq = (0, request_1.default)(reqOpts);
42
+ proxyReq.on('error', function (err) {
43
+ traffic.asError(err);
44
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
45
+ if (!res.headersSent) {
46
+ res.status(500).send({ error: '' + err });
47
+ }
48
+ });
49
+ proxyReq.on('response', function (response) {
50
+ //TODO: Include the response body in the traffic object when it is not a stream
51
+ traffic.withResponse({
52
+ code: response.statusCode,
53
+ headers: response.headers,
54
+ body: null,
55
+ });
56
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
57
+ });
58
+ //We need to pipe the proxy response to the client response to handle sockets and event streams
59
+ proxyReq.pipe(res);
60
+ }
61
+ exports.proxyHttpRequest = proxyHttpRequest;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ /// <reference types="node" />
6
+ import { Task } from './taskManager';
7
+ import { SourceOfChange } from './types';
8
+ import { EventEmitter } from 'node:events';
9
+ declare class RepositoryManager extends EventEmitter {
10
+ private _registryService;
11
+ private watcher;
12
+ constructor();
13
+ listenForChanges(): void;
14
+ stopListening(): Promise<void>;
15
+ /**
16
+ * Setting the source of change helps us know
17
+ * how to react to changes in the UI.
18
+ */
19
+ setSourceOfChangeFor(file: string, source: SourceOfChange): Promise<void>;
20
+ clearSourceOfChangeFor(file: string): Promise<void>;
21
+ ensureDefaultProviders(): Promise<void>;
22
+ /**
23
+ * Will go through all available assets and get a list of
24
+ * providers that are not referenced anywhere.
25
+ *
26
+ * It will also make sure to not include the latest version of an asset.
27
+ *
28
+ */
29
+ getUnusedProviders(): Promise<string[]>;
30
+ getUpdatableAssets(allNames: string[]): Promise<string[]>;
31
+ private scheduleInstallation;
32
+ ensureAsset(handle: string, name: string, version: string, wait?: boolean): Promise<undefined | Task[]>;
33
+ }
34
+ export declare const repositoryManager: RepositoryManager;
35
+ export {};
@@ -0,0 +1,247 @@
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.repositoryManager = void 0;
11
+ const node_os_1 = __importDefault(require("node:os"));
12
+ const socketManager_1 = require("./socketManager");
13
+ const schemas_1 = require("@kapeta/schemas");
14
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
15
+ const definitionsManager_1 = require("./definitionsManager");
16
+ const taskManager_1 = require("./taskManager");
17
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
18
+ const progressListener_1 = require("./progressListener");
19
+ const RepositoryWatcher_1 = require("./RepositoryWatcher");
20
+ const cacheManager_1 = require("./cacheManager");
21
+ const node_events_1 = require("node:events");
22
+ const EVENT_DEFAULT_PROVIDERS_START = 'default-providers-start';
23
+ const EVENT_DEFAULT_PROVIDERS_END = 'default-providers-end';
24
+ const DEFAULT_PROVIDERS = [
25
+ 'kapeta/block-type-service',
26
+ 'kapeta/block-type-frontend',
27
+ 'kapeta/block-type-gateway-http',
28
+ 'kapeta/resource-type-rest-api',
29
+ 'kapeta/resource-type-rest-client',
30
+ 'kapeta/resource-type-web-page',
31
+ 'kapeta/resource-type-web-fragment',
32
+ 'kapeta/resource-type-mongodb',
33
+ 'kapeta/resource-type-postgresql',
34
+ 'kapeta/resource-type-smtp-client',
35
+ 'kapeta/language-target-react-ts',
36
+ 'kapeta/language-target-nodejs',
37
+ ];
38
+ class RepositoryManager extends node_events_1.EventEmitter {
39
+ _registryService;
40
+ watcher;
41
+ constructor() {
42
+ super();
43
+ this._registryService = new nodejs_registry_utils_1.RegistryService(nodejs_registry_utils_1.Config.data.registry.url);
44
+ this.watcher = new RepositoryWatcher_1.RepositoryWatcher();
45
+ this.listenForChanges();
46
+ this.watcher.on('change', (file, source) => {
47
+ this.emit('change', file, source);
48
+ });
49
+ }
50
+ listenForChanges() {
51
+ this.watcher.watch();
52
+ }
53
+ async stopListening() {
54
+ return this.watcher.unwatch();
55
+ }
56
+ /**
57
+ * Setting the source of change helps us know
58
+ * how to react to changes in the UI.
59
+ */
60
+ setSourceOfChangeFor(file, source) {
61
+ return this.watcher.setSourceOfChangeFor(file, source);
62
+ }
63
+ clearSourceOfChangeFor(file) {
64
+ return this.watcher.clearSourceOfChangeFor(file);
65
+ }
66
+ async ensureDefaultProviders() {
67
+ socketManager_1.socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_START, { providers: DEFAULT_PROVIDERS });
68
+ const tasks = await this.scheduleInstallation(DEFAULT_PROVIDERS);
69
+ Promise.allSettled(tasks.map((t) => t.wait())).then(() => {
70
+ socketManager_1.socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_END, {});
71
+ });
72
+ }
73
+ /**
74
+ * Will go through all available assets and get a list of
75
+ * providers that are not referenced anywhere.
76
+ *
77
+ * It will also make sure to not include the latest version of an asset.
78
+ *
79
+ */
80
+ async getUnusedProviders() {
81
+ const allDefinitions = await definitionsManager_1.definitionsManager.getDefinitions();
82
+ const blocks = [];
83
+ const plans = [];
84
+ const providerMap = new Map();
85
+ const providerVersions = {};
86
+ const unusedProviders = new Set();
87
+ allDefinitions.forEach((d) => {
88
+ if (d.definition.kind === 'core/plan') {
89
+ plans.push(d);
90
+ return;
91
+ }
92
+ if (d.definition.kind.startsWith('core/')) {
93
+ const ref = (0, nodejs_utils_1.normalizeKapetaUri)(`${d.definition.metadata.name}:${d.version}`);
94
+ providerMap.set(ref, d);
95
+ if (!providerVersions[d.definition.metadata.name]) {
96
+ providerVersions[d.definition.metadata.name] = new Set();
97
+ }
98
+ providerVersions[d.definition.metadata.name].add(d.version);
99
+ unusedProviders.add(ref);
100
+ return;
101
+ }
102
+ blocks.push(d);
103
+ });
104
+ const latestVersions = {};
105
+ Object.entries(providerVersions).forEach(([name, versions]) => {
106
+ const versionArray = Array.from(versions);
107
+ versionArray.sort((a, b) => {
108
+ return (0, nodejs_utils_1.parseVersion)(a).compareTo((0, nodejs_utils_1.parseVersion)(b)) * -1;
109
+ });
110
+ latestVersions[name] = versionArray[0];
111
+ });
112
+ function markDependencyAsUsed(dep) {
113
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(dep.name);
114
+ const ref = uri.toNormalizedString();
115
+ if (unusedProviders.has(ref)) {
116
+ unusedProviders.delete(ref);
117
+ }
118
+ }
119
+ plans.forEach((plan) => {
120
+ const dependencies = (0, schemas_1.resolveDependencies)(plan.definition);
121
+ dependencies.forEach(markDependencyAsUsed);
122
+ });
123
+ blocks.forEach((block) => {
124
+ const blockTypeKind = (0, nodejs_utils_1.normalizeKapetaUri)(block.definition.kind);
125
+ unusedProviders.delete(blockTypeKind);
126
+ const blockTypeProvider = providerMap.get(blockTypeKind);
127
+ if (!blockTypeProvider) {
128
+ console.warn('No provider found for block type', block.definition.kind);
129
+ return;
130
+ }
131
+ const dependencies = (0, schemas_1.resolveDependencies)(block.definition, blockTypeProvider.definition);
132
+ dependencies.forEach(markDependencyAsUsed);
133
+ });
134
+ return Array.from(unusedProviders).filter((ref) => {
135
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
136
+ if (uri.version == 'local') {
137
+ // Don't delete local assets
138
+ return false;
139
+ }
140
+ // Don't delete the latest version of an asset
141
+ return latestVersions[uri.fullName] !== uri.version;
142
+ });
143
+ }
144
+ async getUpdatableAssets(allNames) {
145
+ const names = Array.from(new Set(allNames));
146
+ const currentVersions = await Promise.all(names.map((name) => definitionsManager_1.definitionsManager.getLatestDefinition(name).catch(() => undefined)));
147
+ const latestVersions = await Promise.all(names.map((name) => this._registryService.getLatestVersion(name).catch(() => undefined)));
148
+ return names
149
+ .map((name, index) => {
150
+ const currentVersion = currentVersions[index];
151
+ const latestVersion = latestVersions[index];
152
+ if (!currentVersion || !latestVersion) {
153
+ // Shouldn't happen unless the registry is down or an asset was deleted
154
+ return undefined;
155
+ }
156
+ const ref = (0, nodejs_utils_1.normalizeKapetaUri)(`${name}:${latestVersion.version}`);
157
+ if (currentVersion.version === latestVersion.version) {
158
+ return undefined;
159
+ }
160
+ return ref;
161
+ })
162
+ .filter((ref) => !!ref);
163
+ }
164
+ async scheduleInstallation(refs) {
165
+ //We make sure to only install one asset at a time - otherwise unexpected things might happen
166
+ const createInstaller = (ref) => {
167
+ return async (task) => {
168
+ if (await definitionsManager_1.definitionsManager.exists(ref)) {
169
+ return;
170
+ }
171
+ const progressListener = new progressListener_1.TaskProgressListener(task);
172
+ //console.log(`Installing asset: ${ref}`);
173
+ //Auto-install missing asset
174
+ try {
175
+ //We change to a temp dir to avoid issues with the current working directory
176
+ process.chdir(node_os_1.default.tmpdir());
177
+ await nodejs_registry_utils_1.Actions.install(progressListener, [ref], {});
178
+ }
179
+ catch (e) {
180
+ console.error(`Failed to install asset: ${ref}`, e);
181
+ throw e;
182
+ }
183
+ cacheManager_1.cacheManager.flush();
184
+ if (await definitionsManager_1.definitionsManager.exists(ref)) {
185
+ return;
186
+ }
187
+ throw new Error(`Failed to find asset after installation: ${ref}. Please try again`);
188
+ };
189
+ };
190
+ const tasks = [];
191
+ while (refs.length > 0) {
192
+ let ref = refs.shift();
193
+ if (!ref) {
194
+ continue;
195
+ }
196
+ ref = (0, nodejs_utils_1.normalizeKapetaUri)(ref);
197
+ if (await definitionsManager_1.definitionsManager.exists(ref)) {
198
+ continue;
199
+ }
200
+ const task = taskManager_1.taskManager.add(`asset:install:${ref}`, createInstaller(ref), {
201
+ name: `Installing ${ref}`,
202
+ group: 'asset:install:', //Group prevents multiple tasks from running at the same time
203
+ });
204
+ tasks.push(task);
205
+ }
206
+ return tasks;
207
+ }
208
+ async ensureAsset(handle, name, version, wait = true) {
209
+ const fullName = `${handle}/${name}`;
210
+ const ref = `${fullName}:${version}`;
211
+ if (version === 'local') {
212
+ //TODO: Get dependencies for local asset
213
+ return;
214
+ }
215
+ const installedAsset = await definitionsManager_1.definitionsManager.getDefinition(`${fullName}:${version}`);
216
+ let assetVersion;
217
+ try {
218
+ assetVersion = await this._registryService.getVersion(fullName, version);
219
+ if (!assetVersion) {
220
+ return;
221
+ }
222
+ }
223
+ catch (e) {
224
+ console.warn(`Unable to resolve asset: ${ref}`, e);
225
+ if (installedAsset) {
226
+ return;
227
+ }
228
+ throw e;
229
+ }
230
+ let tasks = undefined;
231
+ if (!installedAsset) {
232
+ tasks = await this.scheduleInstallation([ref]);
233
+ }
234
+ else {
235
+ //Ensure dependencies are installed
236
+ const refs = assetVersion.dependencies.map((dep) => dep.name);
237
+ if (refs.length > 0) {
238
+ tasks = await this.scheduleInstallation(refs);
239
+ }
240
+ }
241
+ if (tasks && wait) {
242
+ await Promise.all(tasks.map((t) => t.wait()));
243
+ }
244
+ return tasks;
245
+ }
246
+ }
247
+ exports.repositoryManager = new RepositoryManager();
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { EnvironmentType } from './types';
6
+ export declare const HTTP_PORT_TYPE = "http";
7
+ export declare const DEFAULT_PORT_TYPE = "http";
8
+ export declare const HTTP_PORTS: string[];
9
+ declare class ServiceManager {
10
+ private _systems;
11
+ constructor();
12
+ _forLocal(port: string | number, path?: string, environmentType?: EnvironmentType): string;
13
+ _ensureSystem(systemId: string): any;
14
+ _ensureService(systemId: string, serviceId: string): any;
15
+ ensureServicePort(systemId: string, blockInstanceId: string, portType?: string): Promise<any>;
16
+ _save(): void;
17
+ /**
18
+ * Gets the consumable address of a service block resource
19
+ *
20
+ * This returns a local proxy path to allow traffic inspection and control.
21
+ *
22
+ */
23
+ getConsumerAddress(systemId: string, consumerInstanceId: string, consumerResourceName: string, portType: string, environmentType?: EnvironmentType): string;
24
+ /**
25
+ * Gets the direct address of a service block
26
+ *
27
+ * This returns the actual endpoint address of a service that we're talking to.
28
+ * For local services this address will be on localhost - for remote services it will
29
+ * be their remotely available address.
30
+ *
31
+ */
32
+ getProviderAddress(systemId: string, providerInstanceId: string, portType: string): Promise<string>;
33
+ getServices(): any;
34
+ }
35
+ export declare const serviceManager: ServiceManager;
36
+ export {};
@@ -0,0 +1,106 @@
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.serviceManager = exports.HTTP_PORTS = exports.DEFAULT_PORT_TYPE = exports.HTTP_PORT_TYPE = void 0;
11
+ const lodash_1 = __importDefault(require("lodash"));
12
+ const clusterService_1 = require("./clusterService");
13
+ const storageService_1 = require("./storageService");
14
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
15
+ const BlockInstanceRunner_1 = require("./utils/BlockInstanceRunner");
16
+ const utils_1 = require("./utils/utils");
17
+ exports.HTTP_PORT_TYPE = 'http';
18
+ exports.DEFAULT_PORT_TYPE = exports.HTTP_PORT_TYPE;
19
+ exports.HTTP_PORTS = [exports.HTTP_PORT_TYPE, 'web', 'rest'];
20
+ class ServiceManager {
21
+ _systems;
22
+ constructor() {
23
+ this._systems = storageService_1.storageService.get('services');
24
+ if (!this._systems) {
25
+ this._systems = {};
26
+ }
27
+ lodash_1.default.forEach(this._systems, (system) => {
28
+ lodash_1.default.forEach(system, (services) => {
29
+ lodash_1.default.forEach(services, (portInfo) => {
30
+ clusterService_1.clusterService.reservePort(portInfo.port);
31
+ });
32
+ });
33
+ });
34
+ }
35
+ _forLocal(port, path, environmentType) {
36
+ if (!path) {
37
+ path = '';
38
+ }
39
+ const hostname = (0, utils_1.getRemoteHostForEnvironment)(environmentType);
40
+ if (path.startsWith('/')) {
41
+ path = path.substring(1);
42
+ }
43
+ return `http://${hostname}:${port}/${path}`;
44
+ }
45
+ _ensureSystem(systemId) {
46
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
47
+ if (!this._systems[systemId]) {
48
+ this._systems[systemId] = {};
49
+ }
50
+ return this._systems[systemId];
51
+ }
52
+ _ensureService(systemId, serviceId) {
53
+ const system = this._ensureSystem(systemId);
54
+ if (!system[serviceId]) {
55
+ system[serviceId] = {};
56
+ }
57
+ return system[serviceId];
58
+ }
59
+ async ensureServicePort(systemId, blockInstanceId, portType = exports.DEFAULT_PORT_TYPE) {
60
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
61
+ if (!portType) {
62
+ portType = exports.DEFAULT_PORT_TYPE;
63
+ }
64
+ portType = (0, BlockInstanceRunner_1.resolvePortType)(portType);
65
+ const service = this._ensureService(systemId, blockInstanceId);
66
+ if (!service[portType]) {
67
+ const port = await clusterService_1.clusterService.getNextAvailablePort();
68
+ service[portType] = { port };
69
+ this._save();
70
+ }
71
+ const portTypeSection = service[portType];
72
+ return portTypeSection.port;
73
+ }
74
+ _save() {
75
+ storageService_1.storageService.put('services', this._systems);
76
+ }
77
+ /**
78
+ * Gets the consumable address of a service block resource
79
+ *
80
+ * This returns a local proxy path to allow traffic inspection and control.
81
+ *
82
+ */
83
+ getConsumerAddress(systemId, consumerInstanceId, consumerResourceName, portType, environmentType) {
84
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
85
+ const port = clusterService_1.clusterService.getClusterServicePort();
86
+ const path = clusterService_1.clusterService.getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType);
87
+ return this._forLocal(port, path, environmentType);
88
+ }
89
+ /**
90
+ * Gets the direct address of a service block
91
+ *
92
+ * This returns the actual endpoint address of a service that we're talking to.
93
+ * For local services this address will be on localhost - for remote services it will
94
+ * be their remotely available address.
95
+ *
96
+ */
97
+ async getProviderAddress(systemId, providerInstanceId, portType) {
98
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
99
+ const port = await this.ensureServicePort(systemId, providerInstanceId, portType);
100
+ return this._forLocal(port);
101
+ }
102
+ getServices() {
103
+ return this._systems;
104
+ }
105
+ }
106
+ exports.serviceManager = new ServiceManager();
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { Server } from 'socket.io';
6
+ import { LogEntry } from './types';
7
+ export declare const EVENT_STATUS_CHANGED = "status-changed";
8
+ export declare const EVENT_INSTANCE_CREATED = "instance-created";
9
+ export declare const EVENT_INSTANCE_EXITED = "instance-exited";
10
+ export declare const EVENT_INSTANCE_LOG = "instance-log";
11
+ export declare const EVENT_SYSTEM_LOG = "system-log";
12
+ export declare const EVENT_LOG = "log";
13
+ export declare class SocketManager {
14
+ private _io;
15
+ private readonly _sockets;
16
+ constructor();
17
+ setIo(io: Server): void;
18
+ isAlive(): boolean;
19
+ private get io();
20
+ emit(context: string, type: string, payload: any): void;
21
+ emitGlobal(type: string, payload: any): void;
22
+ emitSystemEvent(systemId: string, type: string, payload: any): void;
23
+ emitInstanceLog(systemId: string, instanceId: string, payload: LogEntry): void;
24
+ emitSystemLog(systemId: string, payload: LogEntry): void;
25
+ emitGlobalLog(payload: LogEntry): void;
26
+ private _bindIO;
27
+ private _handleSocketCreated;
28
+ private _bindSocket;
29
+ private handleJoinRoom;
30
+ private handleLeaveRoom;
31
+ }
32
+ export declare const socketManager: SocketManager;