@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,5 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ export {};
@@ -0,0 +1,48 @@
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
+ const rest_1 = require("../../../src/proxy/types/rest");
8
+ describe('getRestMethodId', () => {
9
+ it('should match @Query in url', () => {
10
+ const restResource = new TestResource();
11
+ const restMethodId = (0, rest_1.getRestMethodId)(restResource, 'POST', '/names?name=Ib');
12
+ expect(restMethodId).toBeDefined();
13
+ });
14
+ });
15
+ class TestResource {
16
+ kind = '';
17
+ metadata = new TestResourceMetaData();
18
+ get spec() {
19
+ return {
20
+ methods: [
21
+ {
22
+ responseType: {
23
+ ref: 'Name[]',
24
+ },
25
+ method: 'GET',
26
+ path: '/names',
27
+ arguments: {},
28
+ },
29
+ {
30
+ responseType: {
31
+ ref: 'Name',
32
+ },
33
+ method: 'POST',
34
+ path: '/names',
35
+ arguments: {
36
+ name: {
37
+ type: 'string',
38
+ transport: 'QUERY',
39
+ },
40
+ },
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ }
46
+ class TestResourceMetaData {
47
+ name = '';
48
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ export {};
@@ -0,0 +1,27 @@
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
+ const pathTemplateParser_1 = require("../../src/utils/pathTemplateParser");
8
+ describe('pathTemplateParser', () => {
9
+ it('must return parameters for query parameters from parse', () => {
10
+ const template = new pathTemplateParser_1.PathTemplate('/names');
11
+ const parse = template.parse('/names?name=Ib#test');
12
+ console.log(parse);
13
+ expect(parse).toBeTruthy();
14
+ });
15
+ it('must return parameters defined in url', () => {
16
+ const template = new pathTemplateParser_1.PathTemplate('/names/{identityId}');
17
+ const parse = template.parse('/names/idn_xxyyzz');
18
+ expect(parse).toBeTruthy();
19
+ expect(parse).toMatchObject({ identityId: 'idn_xxyyzz' });
20
+ });
21
+ it('must return parameters defined in url regardless of query parameters', () => {
22
+ const template = new pathTemplateParser_1.PathTemplate('/names/{identityId}');
23
+ const parse = template.parse('/names/idn_xxyyzz?name=Ib#test');
24
+ expect(parse).toBeTruthy();
25
+ expect(parse).toMatchObject({ identityId: 'idn_xxyyzz' });
26
+ });
27
+ });
package/index.ts ADDED
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import { clusterService } from './src/clusterService';
7
+ import { storageService } from './src/storageService';
8
+ import { serviceManager } from './src/serviceManager';
9
+ import { socketManager } from './src/socketManager';
10
+ import { containerManager } from './src/containerManager';
11
+ import express from 'express';
12
+ import HTTP from 'http';
13
+ import { Server } from 'socket.io';
14
+
15
+ import TrafficRoutes from './src/traffic/routes';
16
+ import ProxyRoutes from './src/proxy/routes';
17
+ import ConfigRoutes from './src/config/routes';
18
+ import InstancesRoutes from './src/instances/routes';
19
+ import IdentitiesRoutes from './src/identities/routes';
20
+ import FilesystemRoutes from './src/filesystem/routes';
21
+ import AssetsRoutes from './src/assets/routes';
22
+ import ProviderRoutes from './src/providers/routes';
23
+ import AttachmentRoutes from './src/attachments/routes';
24
+ import TaskRoutes from './src/tasks/routes';
25
+ import APIRoutes from './src/api';
26
+ import AIRoutes from './src/ai/routes';
27
+ import { isLinux } from './src/utils/utils';
28
+ import request from 'request';
29
+ import { repositoryManager } from './src/repositoryManager';
30
+ import { taskManager } from './src/taskManager';
31
+ import { ensureCLI, ensureCLICommands } from './src/utils/commandLineUtils';
32
+ import { defaultProviderInstaller } from './src/utils/DefaultProviderInstaller';
33
+ import { authManager } from './src/authManager';
34
+ import { codeGeneratorManager } from './src/codeGeneratorManager';
35
+ import * as Sentry from '@sentry/node';
36
+ import { assetManager } from './src/assetManager';
37
+
38
+ Sentry.init({
39
+ dsn: 'https://0b7cc946d82c591473d6f95fff5e210b@o4505820837249024.ingest.sentry.io/4506212692000768',
40
+ enabled: process.env.NODE_ENV !== 'development',
41
+ // Performance Monitoring on every ~20th request
42
+ tracesSampleRate: 0.05,
43
+ // Set sampling rate for profiling - this is relative to tracesSampleRate
44
+ profilesSampleRate: 1.0,
45
+ });
46
+
47
+ export type LocalClusterService = HTTP.Server & { host?: string; port?: number };
48
+
49
+ export type StartResult = { host: string; port: number; dockerStatus: boolean };
50
+
51
+ let currentServer: LocalClusterService | null = null;
52
+
53
+ function createServer() {
54
+ const app = express();
55
+
56
+ Sentry.addIntegration(new Sentry.Integrations.Http({ tracing: true }));
57
+ Sentry.addIntegration(new Sentry.Integrations.Express({ app }));
58
+
59
+ // This causes node < 20 to crash on request.
60
+ //app.use(Sentry.Handlers.requestHandler());
61
+
62
+ // TracingHandler creates a trace for every incoming request
63
+ app.use(Sentry.Handlers.tracingHandler());
64
+
65
+ app.use('/traffic', TrafficRoutes);
66
+ app.use('/proxy', ProxyRoutes);
67
+ app.use('/config', ConfigRoutes);
68
+ app.use('/instances', InstancesRoutes);
69
+ app.use('/identities', IdentitiesRoutes);
70
+ app.use('/files', FilesystemRoutes);
71
+ app.use('/assets', AssetsRoutes);
72
+ app.use('/providers', ProviderRoutes);
73
+ app.use('/attachments', AttachmentRoutes);
74
+ app.use('/tasks', TaskRoutes);
75
+ app.use('/api', APIRoutes);
76
+ app.use('/ai', AIRoutes);
77
+
78
+ app.get('/status', async (req, res) => {
79
+ res.send({
80
+ ok: true,
81
+ dockerStatus: await containerManager.checkAlive(),
82
+ socketStatus: socketManager.isAlive(),
83
+ });
84
+ });
85
+
86
+ app.get('/ping', async (req, res) => {
87
+ res.send({
88
+ ok: true,
89
+ });
90
+ });
91
+
92
+ app.use('/', (req: express.Request, res: express.Response) => {
93
+ console.error('Invalid request: %s %s', req.method, req.originalUrl);
94
+ res.status(400).json({
95
+ ok: false,
96
+ error: 'Unknown',
97
+ });
98
+ });
99
+
100
+ app.use(Sentry.Handlers.errorHandler());
101
+
102
+ /**
103
+ * Central error handler, allows us to return a consistent JSON response wrapper with the error.
104
+ */
105
+ app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => {
106
+ console.error('Error handling request: %s %s', req.method, req.originalUrl, err);
107
+ res.status(err.status || 500).json({
108
+ ok: false,
109
+ error: err.message || 'Unknown error',
110
+ stack: process.env.NODE_ENV !== 'production' ? err.stack : undefined,
111
+ });
112
+ });
113
+
114
+ const server = HTTP.createServer(app);
115
+
116
+ //socket
117
+ const io = new Server(server, {
118
+ cors: {
119
+ //TODO: This should'nt be hardcoded but also shouldn't be "*"
120
+ origin: 'http://localhost:8080',
121
+ },
122
+ });
123
+ socketManager.setIo(io);
124
+ return server;
125
+ }
126
+
127
+ export default {
128
+ isRunning: function () {
129
+ return !!currentServer;
130
+ },
131
+
132
+ getCurrentPort: function () {
133
+ if (!currentServer) {
134
+ return -1;
135
+ }
136
+
137
+ return currentServer.port;
138
+ },
139
+
140
+ ping: async function (host: string, port: number): Promise<{ ok: boolean }> {
141
+ return new Promise((resolve, reject) => {
142
+ request.get(`http://${host}:${port}/ping`, (err, res, body) => {
143
+ if (err) {
144
+ reject(err);
145
+ return;
146
+ }
147
+
148
+ resolve(JSON.parse(body));
149
+ });
150
+ });
151
+ },
152
+
153
+ /**
154
+ * Starts the local cluster service.
155
+ * resolves when listening is done with port number. Rejects if listening failed.
156
+ */
157
+ start: async function (): Promise<StartResult> {
158
+ if (currentServer) {
159
+ throw new Error('Server already started');
160
+ }
161
+
162
+ try {
163
+ console.log('Testing docker runtime...');
164
+ await containerManager.initialize();
165
+ } catch (e: any) {
166
+ console.error(
167
+ 'Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.'
168
+ );
169
+ }
170
+
171
+ await defaultProviderInstaller.checkForDefault();
172
+ await codeGeneratorManager.initialize();
173
+
174
+ const clusterPort = storageService.get('cluster', 'port');
175
+ if (clusterPort) {
176
+ clusterService.setClusterServicePort(clusterPort);
177
+ }
178
+
179
+ const clusterHost = storageService.get('cluster', 'host');
180
+ if (clusterHost) {
181
+ clusterService.setClusterServiceHost(clusterHost);
182
+ }
183
+
184
+ let pingResult = undefined;
185
+ try {
186
+ pingResult = await this.ping(clusterHost, clusterPort);
187
+ } catch (e: any) {
188
+ //Ignore - expected to not be running since we're starting it
189
+ }
190
+
191
+ if (pingResult?.ok) {
192
+ throw new Error(`Cluster service already running on: ${clusterHost}:${clusterPort}.`);
193
+ }
194
+
195
+ await clusterService.init();
196
+
197
+ authManager.listenForChanges();
198
+
199
+ currentServer = createServer();
200
+
201
+ const port = clusterService.getClusterServicePort();
202
+
203
+ const host = clusterService.getClusterServiceHost();
204
+
205
+ if (clusterPort !== port) {
206
+ storageService.put('cluster', 'port', port);
207
+ }
208
+
209
+ if (clusterHost !== host) {
210
+ storageService.put('cluster', 'host', host);
211
+ }
212
+
213
+ return new Promise((resolve, reject) => {
214
+ if (!currentServer) {
215
+ reject(new Error(`Current server wasn't set`));
216
+ return;
217
+ }
218
+ currentServer.once('error', (err) => {
219
+ if (currentServer) {
220
+ currentServer.close();
221
+ currentServer = null;
222
+ }
223
+ reject(err);
224
+ });
225
+
226
+ // On Linux we need to bind to 0.0.0.0 to be able to connect to it from docker containers.
227
+ // TODO: This might pose a security risk - so we should authenticate all requests using a
228
+ // shared secret/nonce that we pass around.
229
+ const bindHost = isLinux() ? '0.0.0.0' : host;
230
+
231
+ currentServer.listen(port, bindHost, async () => {
232
+ try {
233
+ const ensureCLITask = await ensureCLI();
234
+ if (ensureCLITask) {
235
+ await taskManager.waitFor((t) => t === ensureCLITask);
236
+ }
237
+ } catch (e: any) {
238
+ console.error('Failed to install CLI.', e);
239
+ }
240
+
241
+ try {
242
+ await ensureCLICommands();
243
+ } catch (error) {
244
+ console.error('Failed to ensure default CLI commands', error);
245
+ }
246
+
247
+ try {
248
+ // Start installation process for all default providers
249
+ await repositoryManager.ensureDefaultProviders();
250
+ } catch (e: any) {
251
+ console.error('Failed to install default providers.', e);
252
+ }
253
+
254
+ assetManager.startUpgradeInterval();
255
+
256
+ resolve({ host, port, dockerStatus: containerManager.isAlive() });
257
+ });
258
+ currentServer.host = host;
259
+ currentServer.port = port;
260
+ });
261
+ },
262
+
263
+ /**
264
+ * Stops any currently running cluster services.
265
+ * @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
266
+ */
267
+ stop: function () {
268
+ if (currentServer) {
269
+ return new Promise(function (resolve) {
270
+ if (currentServer) {
271
+ currentServer.close(() => resolve(true));
272
+ currentServer = null;
273
+ }
274
+ });
275
+ }
276
+
277
+ return Promise.resolve(false);
278
+ },
279
+ getServices: () => serviceManager.getServices(),
280
+ };
package/jest.config.js ADDED
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ transform: {
5
+ '^.+\\.ts?$': 'ts-jest',
6
+ },
7
+ transformIgnorePatterns: ['<rootDir>/node_modules/'],
8
+ };
package/package.json ADDED
@@ -0,0 +1,134 @@
1
+ {
2
+ "name": "@kapeta/local-cluster-service",
3
+ "version": "0.0.0-96f91ef",
4
+ "description": "Manages configuration, ports and service discovery for locally running Kapeta systems",
5
+ "type": "commonjs",
6
+ "exports": {
7
+ ".": {
8
+ "import": {
9
+ "types": "./dist/esm/index.d.ts",
10
+ "default": "./dist/esm/index.js"
11
+ },
12
+ "require": {
13
+ "types": "./dist/cjs/index.d.cts",
14
+ "default": "./dist/cjs/index.js"
15
+ }
16
+ }
17
+ },
18
+ "types": "./dist/esm/index.d.ts",
19
+ "main": "./dist/cjs/index.js",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/kapetacom/local-cluster-service.git"
23
+ },
24
+ "keywords": [
25
+ "kapeta"
26
+ ],
27
+ "license": "BUSL-1.1",
28
+ "author": {
29
+ "email": "engineering@kapeta.com",
30
+ "name": "Kapeta",
31
+ "url": "https://kapeta.com"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/kapetacom/local-cluster-service/issues"
35
+ },
36
+ "scripts": {
37
+ "start": "node ./dist/cjs/start.js",
38
+ "dev": "npm run start:dev",
39
+ "start:dev": "nodemon -e js,ts,json ./start.ts",
40
+ "test": "jest",
41
+ "clean": "rm -rf ./dist",
42
+ "build:esm": "tsc --module nodenext --moduleResolution nodenext --outDir ./dist/esm && echo '{\"type\":\"module\"}' > ./dist/esm/package.json",
43
+ "build:cjs": "tsc --outDir ./dist/cjs && echo '{\"type\":\"commonjs\"}' > ./dist/cjs/package.json",
44
+ "build": "npm run clean && npm run build:esm && npm run build:cjs",
45
+ "format": "prettier --write .",
46
+ "lint": "tsc --noEmit && eslint src/**/*.ts",
47
+ "prepublishOnly": "npm run build"
48
+ },
49
+ "homepage": "https://github.com/kapetacom/local-cluster-service#readme",
50
+ "dependencies": {
51
+ "@kapeta/codegen": "^1.3.0",
52
+ "@kapeta/local-cluster-config": "^0.4.0",
53
+ "@kapeta/nodejs-api-client": ">=0.2.0 <2",
54
+ "@kapeta/nodejs-process": "^1.2.0",
55
+ "@kapeta/nodejs-registry-utils": ">=0.11.1 <2",
56
+ "@kapeta/nodejs-utils": "<2",
57
+ "@kapeta/schemas": "^3.5.0",
58
+ "@kapeta/sdk-config": "^2.1.1",
59
+ "@kapeta/web-microfrontend": "^1.2.5",
60
+ "@sentry/node": "^7.94.1",
61
+ "@types/dockerode": "^3.3.19",
62
+ "@types/stream-json": "^1.7.3",
63
+ "async-lock": "^1.4.0",
64
+ "chokidar": "^3.5.3",
65
+ "dockerode": "^3.3.5",
66
+ "express": "4.17.1",
67
+ "express-promise-router": "^4.1.1",
68
+ "fs-extra": "^11.1.0",
69
+ "glob": "^7.1.6",
70
+ "gunzip-maybe": "^1.4.2",
71
+ "lodash": "^4.17.15",
72
+ "md5": "2.2.1",
73
+ "node-cache": "^5.1.2",
74
+ "node-uuid": "^1.4.8",
75
+ "qs": "^6.11.2",
76
+ "request": "2.88.2",
77
+ "socket.io": "^4.5.2",
78
+ "stream-json": "^1.8.0",
79
+ "tar-stream": "^3.1.6",
80
+ "typescript": "^5.1.6",
81
+ "yaml": "^1.6.0",
82
+ "@kapeta/config-mapper": "^1.1.1"
83
+ },
84
+ "devDependencies": {
85
+ "@kapeta/eslint-config": "^0.7.0",
86
+ "@kapeta/prettier-config": "^0.6.2",
87
+ "@tsconfig/node18": "^18.2.0",
88
+ "@types/async-lock": "^1.4.0",
89
+ "@types/express": "^4.17.17",
90
+ "@types/fs-extra": "^11.0.1",
91
+ "@types/glob": "^8.1.0",
92
+ "@types/gunzip-maybe": "^1.4.0",
93
+ "@types/jest": "^29.5.4",
94
+ "@types/lodash": "^4.14.195",
95
+ "@types/md5": "^2.3.2",
96
+ "@types/node": "^20.5.8",
97
+ "@types/node-uuid": "^0.0.29",
98
+ "@types/request": "^2.48.8",
99
+ "@types/tar-stream": "^2.2.2",
100
+ "eslint": "^8.42.0",
101
+ "eslint-config-prettier": "^8.8.0",
102
+ "jest": "^29.6.4",
103
+ "nodemon": "^2.0.2",
104
+ "prettier": "^2.8.8",
105
+ "ts-jest": "^29.1.1",
106
+ "ts-node": "^10.9.1"
107
+ },
108
+ "prettier": "@kapeta/prettier-config",
109
+ "release": {
110
+ "plugins": [
111
+ "@semantic-release/commit-analyzer",
112
+ "@semantic-release/release-notes-generator",
113
+ [
114
+ "@semantic-release/changelog",
115
+ {
116
+ "changelogFile": "CHANGELOG.md"
117
+ }
118
+ ],
119
+ "@semantic-release/npm",
120
+ "@semantic-release/github",
121
+ [
122
+ "@semantic-release/git",
123
+ {
124
+ "assets": [
125
+ "CHANGELOG.md",
126
+ "package.json",
127
+ "package-lock.json"
128
+ ],
129
+ "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
130
+ }
131
+ ]
132
+ ]
133
+ }
134
+ }