@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,38 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { BlockInstanceDetails, ConfigProvider, DefaultCredentials, DefaultResourceOptions, InstanceOperator, ResourceInfo } from '@kapeta/sdk-config';
6
+ import { Definition, DefinitionInfo } from '@kapeta/local-cluster-config';
7
+ import { BlockDefinition, Plan } from '@kapeta/schemas';
8
+ import { AnyMap, EnvironmentType } from '../types';
9
+ /**
10
+ * A configuration provider that does the same as the LocalConfigProvider
11
+ * but without calling the API of the local cluster service (since it's running in the same process)
12
+ */
13
+ export declare class InternalConfigProvider implements ConfigProvider {
14
+ private readonly info;
15
+ private readonly systemId;
16
+ private readonly instanceId;
17
+ private readonly config;
18
+ private readonly environment;
19
+ constructor(systemId: string, instanceId: string, info: DefinitionInfo, config: AnyMap, environment?: EnvironmentType);
20
+ getBlockDefinition(): Definition;
21
+ getBlockReference(): string;
22
+ getSystemId(): string;
23
+ getInstanceId(): string;
24
+ getServerPort(portType?: string | undefined): Promise<string>;
25
+ getServiceAddress(serviceName: string, portType: string): Promise<string | null>;
26
+ getResourceInfo<Options = DefaultResourceOptions, Credentials = DefaultCredentials>(resourceType: string, portType: string, resourceName: string): Promise<ResourceInfo<Options, Credentials> | null>;
27
+ getInstanceHost(instanceId: string): Promise<string | null>;
28
+ getServerHost(): Promise<string>;
29
+ getProviderId(): string;
30
+ getOrDefault<T = any>(path: string, defaultValue: T): T;
31
+ get<T = any>(path: string): T | undefined;
32
+ getInstanceOperator<Options = any, Credentials extends DefaultCredentials = DefaultCredentials>(instanceId: string): Promise<InstanceOperator<Options, Credentials> | null>;
33
+ getInstanceForConsumer<BlockType = BlockDefinition>(resourceName: string): Promise<BlockInstanceDetails<BlockType> | null>;
34
+ getInstancesForProvider<BlockType = BlockDefinition>(resourceName: string): Promise<BlockInstanceDetails<BlockType>[]>;
35
+ getBlock(ref: any): Promise<Definition>;
36
+ getPlan(): Promise<Plan>;
37
+ }
38
+ export declare function createInternalConfigProvider(systemId: string, instanceId: string, info: DefinitionInfo): Promise<InternalConfigProvider>;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createInternalConfigProvider = exports.InternalConfigProvider = void 0;
7
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
8
+ const configManager_1 = require("../configManager");
9
+ const lodash_1 = __importDefault(require("lodash"));
10
+ const serviceManager_1 = require("../serviceManager");
11
+ const operatorManager_1 = require("../operatorManager");
12
+ const instanceManager_1 = require("../instanceManager");
13
+ const definitionsManager_1 = require("../definitionsManager");
14
+ const utils_1 = require("./utils");
15
+ /**
16
+ * A configuration provider that does the same as the LocalConfigProvider
17
+ * but without calling the API of the local cluster service (since it's running in the same process)
18
+ */
19
+ class InternalConfigProvider {
20
+ info;
21
+ systemId;
22
+ instanceId;
23
+ config;
24
+ environment;
25
+ constructor(systemId, instanceId, info, config, environment = 'docker') {
26
+ this.info = info;
27
+ this.systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
28
+ this.instanceId = instanceId;
29
+ this.config = config;
30
+ this.environment = environment;
31
+ }
32
+ getBlockDefinition() {
33
+ return this.info.definition;
34
+ }
35
+ getBlockReference() {
36
+ return (0, nodejs_utils_1.normalizeKapetaUri)(this.info.definition.metadata.name + ':' + this.info.version);
37
+ }
38
+ getSystemId() {
39
+ return this.systemId;
40
+ }
41
+ getInstanceId() {
42
+ return this.instanceId;
43
+ }
44
+ getServerPort(portType) {
45
+ return serviceManager_1.serviceManager.ensureServicePort(this.systemId, this.instanceId, portType);
46
+ }
47
+ async getServiceAddress(serviceName, portType) {
48
+ return serviceManager_1.serviceManager.getConsumerAddress(this.systemId, this.instanceId, serviceName, portType, this.environment);
49
+ }
50
+ getResourceInfo(resourceType, portType, resourceName) {
51
+ return operatorManager_1.operatorManager.getConsumerResourceInfo(this.systemId, this.instanceId, resourceType, portType, resourceName, this.environment, false);
52
+ }
53
+ async getInstanceHost(instanceId) {
54
+ const instance = instanceManager_1.instanceManager.getInstance(this.systemId, instanceId);
55
+ return instance?.address ?? null;
56
+ }
57
+ async getServerHost() {
58
+ return (0, utils_1.getBindAddressForEnvironment)(this.environment);
59
+ }
60
+ getProviderId() {
61
+ return 'internal';
62
+ }
63
+ getOrDefault(path, defaultValue) {
64
+ return this.get(path) ?? defaultValue;
65
+ }
66
+ get(path) {
67
+ return lodash_1.default.get(this.config, path);
68
+ }
69
+ getInstanceOperator(instanceId) {
70
+ return instanceManager_1.instanceManager.getInstanceOperator(this.systemId, instanceId, this.environment, false);
71
+ }
72
+ async getInstanceForConsumer(resourceName) {
73
+ const plan = await this.getPlan();
74
+ if (!plan) {
75
+ throw new Error('Could not find plan');
76
+ }
77
+ const instanceId = this.getInstanceId();
78
+ const connection = plan.spec.connections.find((connection) => connection.consumer.blockId === instanceId && connection.consumer.resourceName === resourceName);
79
+ if (!connection) {
80
+ throw new Error(`Could not find connection for consumer ${resourceName}`);
81
+ }
82
+ const instance = plan.spec.blocks.find((b) => b.id === connection.provider.blockId);
83
+ if (!instance) {
84
+ throw new Error(`Could not find instance ${connection.provider.blockId} in plan`);
85
+ }
86
+ const block = await this.getBlock(instance.block.ref);
87
+ if (!block) {
88
+ throw new Error(`Could not find block ${instance.block.ref} in plan`);
89
+ }
90
+ return {
91
+ instanceId: connection.provider.blockId,
92
+ connections: [connection],
93
+ block: block,
94
+ };
95
+ }
96
+ async getInstancesForProvider(resourceName) {
97
+ const plan = await this.getPlan();
98
+ if (!plan) {
99
+ throw new Error('Could not find plan');
100
+ }
101
+ const instanceId = this.getInstanceId();
102
+ const blockDetails = {};
103
+ const connections = plan.spec.connections.filter((connection) => connection.provider.blockId === instanceId && connection.provider.resourceName === resourceName);
104
+ for (const connection of connections) {
105
+ const blockInstanceId = connection.consumer.blockId;
106
+ if (blockDetails[blockInstanceId]) {
107
+ blockDetails[blockInstanceId].connections.push(connection);
108
+ continue;
109
+ }
110
+ const instance = plan.spec.blocks.find((b) => b.id === blockInstanceId);
111
+ if (!instance) {
112
+ throw new Error(`Could not find instance ${blockInstanceId} in plan`);
113
+ }
114
+ const block = await this.getBlock(instance.block.ref);
115
+ if (!block) {
116
+ throw new Error(`Could not find block ${instance.block.ref} in plan`);
117
+ }
118
+ blockDetails[blockInstanceId] = {
119
+ instanceId: blockInstanceId,
120
+ connections: [connection],
121
+ block: block,
122
+ };
123
+ }
124
+ return Object.values(blockDetails);
125
+ }
126
+ async getBlock(ref) {
127
+ const definition = await definitionsManager_1.definitionsManager.getDefinition(ref);
128
+ if (!definition) {
129
+ throw new Error(`Could not find definition for ${ref}`);
130
+ }
131
+ return definition.definition;
132
+ }
133
+ async getPlan() {
134
+ const definition = await definitionsManager_1.definitionsManager.getDefinition(this.systemId);
135
+ if (!definition) {
136
+ throw new Error(`Could not find plan ${this.systemId}`);
137
+ }
138
+ return definition.definition;
139
+ }
140
+ }
141
+ exports.InternalConfigProvider = InternalConfigProvider;
142
+ async function createInternalConfigProvider(systemId, instanceId, info) {
143
+ const config = await configManager_1.configManager.getConfigForBlockInstance(systemId, instanceId);
144
+ return new InternalConfigProvider(systemId, instanceId, info, config);
145
+ }
146
+ exports.createInternalConfigProvider = createInternalConfigProvider;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { LogEntry, LogLevel, LogSource } from '../types';
6
+ export declare class LogData {
7
+ static readonly MAX_LINES = 1000;
8
+ private readonly entries;
9
+ constructor();
10
+ /**
11
+ *
12
+ * @param {string} msg
13
+ * @param {string} [level]
14
+ * @param {string} [source]
15
+ */
16
+ addLog(msg: string, level?: LogLevel, source?: LogSource): void;
17
+ /**
18
+ *
19
+ * @return {LogEntry[]}
20
+ */
21
+ getLogs(): LogEntry[];
22
+ toString(): string;
23
+ }
@@ -0,0 +1,46 @@
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.LogData = void 0;
8
+ const MAX_LINES = 1000;
9
+ class LogData {
10
+ static MAX_LINES = MAX_LINES;
11
+ entries = [];
12
+ constructor() { }
13
+ /**
14
+ *
15
+ * @param {string} msg
16
+ * @param {string} [level]
17
+ * @param {string} [source]
18
+ */
19
+ addLog(msg, level = 'INFO', source = 'stdout') {
20
+ while (this.entries.length > MAX_LINES) {
21
+ this.entries.shift();
22
+ }
23
+ if (!msg.endsWith('\n')) {
24
+ msg += '\n';
25
+ }
26
+ this.entries.push({
27
+ time: Date.now(),
28
+ message: msg,
29
+ level,
30
+ source,
31
+ });
32
+ }
33
+ /**
34
+ *
35
+ * @return {LogEntry[]}
36
+ */
37
+ getLogs() {
38
+ return this.entries;
39
+ }
40
+ toString() {
41
+ return this.getLogs()
42
+ .map((entry) => entry.message)
43
+ .join('\n');
44
+ }
45
+ }
46
+ exports.LogData = LogData;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { Task } from '../taskManager';
6
+ export declare function hasCLI(): Promise<boolean>;
7
+ export declare function ensureCLI(): Promise<Task<void> | null>;
8
+ export declare function ensureCLICommands(): Promise<void>;
@@ -0,0 +1,39 @@
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.ensureCLICommands = exports.ensureCLI = exports.hasCLI = void 0;
8
+ const nodejs_process_1 = require("@kapeta/nodejs-process");
9
+ const taskManager_1 = require("../taskManager");
10
+ async function hasCLI() {
11
+ return (0, nodejs_process_1.hasApp)('kap');
12
+ }
13
+ exports.hasCLI = hasCLI;
14
+ async function ensureCLI() {
15
+ if (await hasCLI()) {
16
+ return null;
17
+ }
18
+ return taskManager_1.taskManager.add(`cli:install`, (task) => {
19
+ const process = (0, nodejs_process_1.spawn)('npm', ['install', '-g', '@kapeta/kap'], {
20
+ shell: true,
21
+ });
22
+ process.process.stdout?.on('data', (data) => {
23
+ task.addLog(data.toString(), 'INFO');
24
+ });
25
+ process.process.stderr?.on('data', (data) => {
26
+ task.addLog(data.toString(), 'ERROR');
27
+ });
28
+ return process.wait();
29
+ }, {
30
+ name: `Installing Kapeta CLI`,
31
+ });
32
+ }
33
+ exports.ensureCLI = ensureCLI;
34
+ function ensureCLICommands() {
35
+ console.log('Run `kap init` to ensure default commands are installed');
36
+ const process = (0, nodejs_process_1.spawn)('kap', ['init'], { shell: true });
37
+ return process.wait();
38
+ }
39
+ exports.ensureCLICommands = ensureCLICommands;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { StringMap } from '../types';
6
+ /**
7
+ * A path template is a string that can be used to match a path and extract variables from it.
8
+ *
9
+ * E.g. /foo/{bar}/baz
10
+ *
11
+ * Would match /foo/123/baz and extract bar=123
12
+ *
13
+ * You can also specify a regex for the variable:
14
+ * /foo/{bar:[0-9]+}/baz
15
+ *
16
+ */
17
+ export declare class PathTemplate {
18
+ private _path;
19
+ private _parts;
20
+ constructor(pathTemplate: string);
21
+ get path(): string;
22
+ matches(path: string): boolean;
23
+ parse(path: string): StringMap | null;
24
+ create(variables: StringMap): string;
25
+ toString(): string;
26
+ }
27
+ /**
28
+ * Parses a path into a RESTPath
29
+ */
30
+ export declare function pathTemplateParser(path: string): PathTemplate;
@@ -0,0 +1,135 @@
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.pathTemplateParser = exports.PathTemplate = void 0;
8
+ const TYPE_VARIABLE = 'variable';
9
+ const TYPE_PATH = 'path';
10
+ function normalizePath(path) {
11
+ if (!path.startsWith('/')) {
12
+ path = '/' + path;
13
+ }
14
+ if (path.includes('#')) {
15
+ path = path.split('#')[0];
16
+ }
17
+ if (path.includes('?')) {
18
+ path = path.split('?')[0];
19
+ }
20
+ return path;
21
+ }
22
+ /**
23
+ * A path template is a string that can be used to match a path and extract variables from it.
24
+ *
25
+ * E.g. /foo/{bar}/baz
26
+ *
27
+ * Would match /foo/123/baz and extract bar=123
28
+ *
29
+ * You can also specify a regex for the variable:
30
+ * /foo/{bar:[0-9]+}/baz
31
+ *
32
+ */
33
+ class PathTemplate {
34
+ _path;
35
+ _parts = [];
36
+ constructor(pathTemplate) {
37
+ if (!pathTemplate.startsWith('/')) {
38
+ pathTemplate = '/' + pathTemplate;
39
+ }
40
+ this._path = pathTemplate;
41
+ const variableRegex = /{([^}]+)}/g;
42
+ let match, offset = 0;
43
+ this._parts = [];
44
+ while ((match = variableRegex.exec(pathTemplate)) !== null) {
45
+ if (match.index > offset) {
46
+ this._parts.push({
47
+ type: TYPE_PATH,
48
+ value: pathTemplate.substring(offset, match.index),
49
+ });
50
+ }
51
+ let regex;
52
+ let value = match[1];
53
+ [value, regex] = value.split(/:/, 2);
54
+ if (regex) {
55
+ regex = new RegExp('^' + regex);
56
+ }
57
+ else {
58
+ regex = /^[^\/]+/;
59
+ }
60
+ this._parts.push({
61
+ type: TYPE_VARIABLE,
62
+ value,
63
+ regex,
64
+ });
65
+ offset = match.index + match[0].length;
66
+ }
67
+ if (offset < pathTemplate.length) {
68
+ this._parts.push({
69
+ type: TYPE_PATH,
70
+ value: pathTemplate.substring(offset),
71
+ });
72
+ }
73
+ }
74
+ get path() {
75
+ return this._path;
76
+ }
77
+ matches(path) {
78
+ return this.parse(path) !== null;
79
+ }
80
+ parse(path) {
81
+ path = normalizePath(path);
82
+ const values = {};
83
+ for (let i = 0; i < this._parts.length; i++) {
84
+ const part = this._parts[i];
85
+ switch (part.type) {
86
+ case TYPE_PATH:
87
+ if (!path.startsWith(part.value)) {
88
+ return null;
89
+ }
90
+ path = path.substring(part.value.length);
91
+ break;
92
+ case TYPE_VARIABLE:
93
+ if (!part.regex?.test(path)) {
94
+ return null;
95
+ }
96
+ const newPath = path.replace(part.regex, '');
97
+ const value = path.substr(0, path.length - newPath.length);
98
+ values[part.value] = value;
99
+ path = newPath;
100
+ break;
101
+ }
102
+ }
103
+ if (path && path !== '/') {
104
+ //We did not match all of it
105
+ return null;
106
+ }
107
+ return values;
108
+ }
109
+ create(variables) {
110
+ return this._parts
111
+ .map((part) => {
112
+ switch (part.type) {
113
+ case TYPE_PATH:
114
+ return part.value;
115
+ case TYPE_VARIABLE:
116
+ if (variables[part.value] === undefined || variables[part.value] === null) {
117
+ return '';
118
+ }
119
+ return variables[part.value];
120
+ }
121
+ })
122
+ .join('');
123
+ }
124
+ toString() {
125
+ return 'tmpl: ' + this.path;
126
+ }
127
+ }
128
+ exports.PathTemplate = PathTemplate;
129
+ /**
130
+ * Parses a path into a RESTPath
131
+ */
132
+ function pathTemplateParser(path) {
133
+ return new PathTemplate(path);
134
+ }
135
+ exports.pathTemplateParser = pathTemplateParser;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { EntityList, LocalInstance, LocalInstancePort } from '@kapeta/schemas';
6
+ import { AnyMap, EnvironmentType } from '../types';
7
+ export declare function getBlockInstanceContainerName(systemId: string, instanceId: string, blockType?: string): Promise<string>;
8
+ export declare function toPortInfo(port: LocalInstancePort): LocalInstancePort | {
9
+ port: number;
10
+ type: string;
11
+ };
12
+ export declare function getOperatorInstancePorts(systemId: string, operatorId: string, local: LocalInstance): Promise<{
13
+ portType: string;
14
+ port: number | undefined;
15
+ hostPort: any;
16
+ protocol: string | undefined;
17
+ }[]>;
18
+ /**
19
+ * Gets the hostname where all services are available - including the cluster service.
20
+ *
21
+ * For docker this is the internal docker host - otherwise it's the local machine
22
+ * Assumed to be the same address as the cluster service outside docker.
23
+ */
24
+ export declare function getRemoteHostForEnvironment(environment: EnvironmentType | undefined): string;
25
+ /**
26
+ * Get the bind address for the given environment.
27
+ *
28
+ * Outside of docker we bind to 127.0.0.1 - inside we bind to everything (0.0.0.0)
29
+ */
30
+ export declare function getBindAddressForEnvironment(environment: EnvironmentType | undefined, preferredHost?: string): string;
31
+ /**
32
+ * Get the docker host IP address for port binding.
33
+ */
34
+ export declare function getDockerHostIp(preferredHost?: string): string;
35
+ export declare function getRemoteUrl(id: string, defautValue: string): any;
36
+ export declare function readYML(path: string): any;
37
+ export declare function isWindows(): boolean;
38
+ export declare function isMac(): boolean;
39
+ export declare function isLinux(): boolean;
40
+ export declare function getResolvedConfiguration(entities?: EntityList, config?: AnyMap, globalConfiguration?: AnyMap): AnyMap;
@@ -0,0 +1,148 @@
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.getResolvedConfiguration = exports.isLinux = exports.isMac = exports.isWindows = exports.readYML = exports.getRemoteUrl = exports.getDockerHostIp = exports.getBindAddressForEnvironment = exports.getRemoteHostForEnvironment = exports.getOperatorInstancePorts = exports.toPortInfo = exports.getBlockInstanceContainerName = void 0;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const yaml_1 = __importDefault(require("yaml"));
13
+ const md5_1 = __importDefault(require("md5"));
14
+ const schemas_1 = require("@kapeta/schemas");
15
+ const lodash_1 = __importDefault(require("lodash"));
16
+ const types_1 = require("../types");
17
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
18
+ const definitionsManager_1 = require("../definitionsManager");
19
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
20
+ const assetManager_1 = require("../assetManager");
21
+ const serviceManager_1 = require("../serviceManager");
22
+ const clusterService_1 = require("../clusterService");
23
+ async function getBlockInstanceContainerName(systemId, instanceId, blockType) {
24
+ if (!blockType) {
25
+ const instance = await assetManager_1.assetManager.getBlockInstance(systemId, instanceId);
26
+ if (!instance) {
27
+ throw new Error(`Instance ${instanceId} not found in plan ${systemId}`);
28
+ }
29
+ const block = await assetManager_1.assetManager.getAsset(instance.block.ref);
30
+ if (!block) {
31
+ throw new Error(`Block ${instance.block.ref} not found`);
32
+ }
33
+ blockType = block.data.kind;
34
+ }
35
+ const typeDefinition = await definitionsManager_1.definitionsManager.getDefinition(blockType);
36
+ if (!typeDefinition) {
37
+ throw new Error(`Block type ${blockType} not found`);
38
+ }
39
+ if ((0, nodejs_utils_1.parseKapetaUri)(typeDefinition.definition.kind).fullName === types_1.KIND_BLOCK_TYPE_OPERATOR &&
40
+ typeDefinition.definition.spec?.local?.singleton) {
41
+ return `kapeta-instance-operator-${(0, md5_1.default)((0, nodejs_utils_1.normalizeKapetaUri)(systemId) + (0, nodejs_utils_1.normalizeKapetaUri)(blockType))}`;
42
+ }
43
+ return `kapeta-block-instance-${(0, md5_1.default)((0, nodejs_utils_1.normalizeKapetaUri)(systemId) + instanceId)}`;
44
+ }
45
+ exports.getBlockInstanceContainerName = getBlockInstanceContainerName;
46
+ function toPortInfo(port) {
47
+ if (typeof port === 'number' || typeof port === 'string') {
48
+ return { port: parseInt(`${port}`), type: 'tcp' };
49
+ }
50
+ if (!port.type) {
51
+ port.type = schemas_1.LocalInstancePortType.TCP;
52
+ }
53
+ return port;
54
+ }
55
+ exports.toPortInfo = toPortInfo;
56
+ async function getOperatorInstancePorts(systemId, operatorId, local) {
57
+ const localPorts = local.ports ?? {};
58
+ const promises = Object.entries(localPorts).map(async ([portType, value]) => {
59
+ const portInfo = toPortInfo(value);
60
+ const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, operatorId, portType);
61
+ return {
62
+ portType,
63
+ port: portInfo.port,
64
+ hostPort,
65
+ protocol: portInfo.type,
66
+ };
67
+ });
68
+ return await Promise.all(promises);
69
+ }
70
+ exports.getOperatorInstancePorts = getOperatorInstancePorts;
71
+ /**
72
+ * Gets the hostname where all services are available - including the cluster service.
73
+ *
74
+ * For docker this is the internal docker host - otherwise it's the local machine
75
+ * Assumed to be the same address as the cluster service outside docker.
76
+ */
77
+ function getRemoteHostForEnvironment(environment) {
78
+ return environment === 'docker' ? types_1.DOCKER_HOST_INTERNAL : clusterService_1.clusterService.getClusterServiceHost();
79
+ }
80
+ exports.getRemoteHostForEnvironment = getRemoteHostForEnvironment;
81
+ /**
82
+ * Get the bind address for the given environment.
83
+ *
84
+ * Outside of docker we bind to 127.0.0.1 - inside we bind to everything (0.0.0.0)
85
+ */
86
+ function getBindAddressForEnvironment(environment, preferredHost = '127.0.0.1') {
87
+ return environment === 'docker' ? '0.0.0.0' : preferredHost;
88
+ }
89
+ exports.getBindAddressForEnvironment = getBindAddressForEnvironment;
90
+ /**
91
+ * Get the docker host IP address for port binding.
92
+ */
93
+ function getDockerHostIp(preferredHost = '127.0.0.1') {
94
+ // On Linux we need to bind to 0.0.0.0 to be able to connect to it from docker containers.
95
+ // TODO: This might pose a security risk - so we should authenticate all requests using a shared secret/nonce that we pass around.
96
+ return isLinux() ? '0.0.0.0' : preferredHost;
97
+ }
98
+ exports.getDockerHostIp = getDockerHostIp;
99
+ function getRemoteUrl(id, defautValue) {
100
+ const remoteConfig = local_cluster_config_1.default.getClusterConfig().remote;
101
+ return remoteConfig?.[id] ?? defautValue;
102
+ }
103
+ exports.getRemoteUrl = getRemoteUrl;
104
+ function readYML(path) {
105
+ const rawYaml = node_fs_1.default.readFileSync(path);
106
+ try {
107
+ return yaml_1.default.parse(rawYaml.toString());
108
+ }
109
+ catch (err) {
110
+ throw new Error(`Failed to parse plan YAML: ${err}`);
111
+ }
112
+ }
113
+ exports.readYML = readYML;
114
+ function isWindows() {
115
+ return 'win32' === process.platform;
116
+ }
117
+ exports.isWindows = isWindows;
118
+ function isMac() {
119
+ return 'darwin' === process.platform;
120
+ }
121
+ exports.isMac = isMac;
122
+ function isLinux() {
123
+ return !isWindows() && !isMac();
124
+ }
125
+ exports.isLinux = isLinux;
126
+ function getResolvedConfiguration(entities, config, globalConfiguration) {
127
+ if (!entities || !globalConfiguration) {
128
+ return config || {};
129
+ }
130
+ const mergedConfig = config ? lodash_1.default.cloneDeep(config) : {};
131
+ entities.types?.forEach((type) => {
132
+ if (!type.properties) {
133
+ return;
134
+ }
135
+ Object.entries(type.properties).forEach(([propertyName, property]) => {
136
+ if (!property.global) {
137
+ return;
138
+ }
139
+ const configPath = type.name + '.' + propertyName;
140
+ const defaultValue = globalConfiguration ? lodash_1.default.get(globalConfiguration, configPath) : undefined;
141
+ if (!lodash_1.default.has(mergedConfig, configPath)) {
142
+ lodash_1.default.set(mergedConfig, configPath, defaultValue);
143
+ }
144
+ });
145
+ });
146
+ return mergedConfig;
147
+ }
148
+ exports.getResolvedConfiguration = getResolvedConfiguration;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ export {};
@@ -0,0 +1,17 @@
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 index_1 = __importDefault(require("./index"));
11
+ index_1.default
12
+ .start()
13
+ .then(({ host, port }) => console.log('Listening on port %s:%s', host, port))
14
+ .catch((e) => {
15
+ console.error('Failed to start local cluster due to an error:\n\t - %s', e);
16
+ process.exit(1);
17
+ });