@kapeta/local-cluster-service 0.6.0 → 0.7.0

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 (193) hide show
  1. package/.eslintrc.cjs +17 -0
  2. package/.github/workflows/main.yml +22 -22
  3. package/.prettierignore +4 -0
  4. package/.vscode/launch.json +2 -4
  5. package/CHANGELOG.md +14 -0
  6. package/definitions.d.ts +17 -35
  7. package/dist/cjs/index.d.ts +27 -0
  8. package/dist/cjs/index.js +126 -0
  9. package/dist/cjs/package.json +1 -0
  10. package/dist/cjs/src/assetManager.d.ts +31 -0
  11. package/dist/cjs/src/assetManager.js +153 -0
  12. package/dist/cjs/src/assets/routes.d.ts +3 -0
  13. package/dist/cjs/src/assets/routes.js +117 -0
  14. package/dist/cjs/src/clusterService.d.ts +40 -0
  15. package/dist/cjs/src/clusterService.js +114 -0
  16. package/dist/cjs/src/codeGeneratorManager.d.ts +8 -0
  17. package/dist/cjs/src/codeGeneratorManager.js +53 -0
  18. package/dist/cjs/src/config/routes.d.ts +3 -0
  19. package/dist/cjs/src/config/routes.js +126 -0
  20. package/dist/cjs/src/configManager.d.ts +36 -0
  21. package/dist/cjs/src/configManager.js +110 -0
  22. package/dist/cjs/src/containerManager.d.ts +89 -0
  23. package/dist/cjs/src/containerManager.js +365 -0
  24. package/dist/cjs/src/filesystem/routes.d.ts +3 -0
  25. package/dist/cjs/src/filesystem/routes.js +69 -0
  26. package/dist/cjs/src/filesystemManager.d.ts +15 -0
  27. package/dist/cjs/src/filesystemManager.js +87 -0
  28. package/dist/cjs/src/identities/routes.d.ts +3 -0
  29. package/dist/cjs/src/identities/routes.js +18 -0
  30. package/dist/cjs/src/instanceManager.d.ts +56 -0
  31. package/dist/cjs/src/instanceManager.js +424 -0
  32. package/dist/cjs/src/instances/routes.d.ts +3 -0
  33. package/dist/cjs/src/instances/routes.js +134 -0
  34. package/dist/cjs/src/middleware/cors.d.ts +2 -0
  35. package/dist/cjs/src/middleware/cors.js +10 -0
  36. package/dist/cjs/src/middleware/kapeta.d.ts +11 -0
  37. package/dist/cjs/src/middleware/kapeta.js +17 -0
  38. package/dist/cjs/src/middleware/stringBody.d.ts +5 -0
  39. package/dist/cjs/src/middleware/stringBody.js +14 -0
  40. package/dist/cjs/src/networkManager.d.ts +32 -0
  41. package/dist/cjs/src/networkManager.js +109 -0
  42. package/dist/cjs/src/operatorManager.d.ts +36 -0
  43. package/dist/cjs/src/operatorManager.js +165 -0
  44. package/dist/cjs/src/progressListener.d.ts +20 -0
  45. package/dist/cjs/src/progressListener.js +91 -0
  46. package/dist/cjs/src/providerManager.d.ts +9 -0
  47. package/dist/cjs/src/providerManager.js +51 -0
  48. package/dist/cjs/src/providers/routes.d.ts +3 -0
  49. package/dist/cjs/src/providers/routes.js +42 -0
  50. package/dist/cjs/src/proxy/routes.d.ts +3 -0
  51. package/dist/cjs/src/proxy/routes.js +111 -0
  52. package/dist/cjs/src/proxy/types/rest.d.ts +4 -0
  53. package/dist/cjs/src/proxy/types/rest.js +114 -0
  54. package/dist/cjs/src/proxy/types/web.d.ts +4 -0
  55. package/dist/cjs/src/proxy/types/web.js +53 -0
  56. package/dist/cjs/src/repositoryManager.d.ts +17 -0
  57. package/dist/cjs/src/repositoryManager.js +215 -0
  58. package/dist/cjs/src/serviceManager.d.ts +29 -0
  59. package/dist/cjs/src/serviceManager.js +99 -0
  60. package/dist/cjs/src/socketManager.d.ts +14 -0
  61. package/dist/cjs/src/socketManager.js +53 -0
  62. package/dist/cjs/src/storageService.d.ts +17 -0
  63. package/dist/cjs/src/storageService.js +74 -0
  64. package/dist/cjs/src/traffic/routes.d.ts +3 -0
  65. package/dist/cjs/src/traffic/routes.js +18 -0
  66. package/dist/cjs/src/types.d.ts +88 -0
  67. package/dist/cjs/src/types.js +2 -0
  68. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +29 -0
  69. package/dist/cjs/src/utils/BlockInstanceRunner.js +468 -0
  70. package/dist/cjs/src/utils/LogData.d.ts +19 -0
  71. package/dist/cjs/src/utils/LogData.js +43 -0
  72. package/dist/cjs/src/utils/pathTemplateParser.d.ts +26 -0
  73. package/dist/cjs/src/utils/pathTemplateParser.js +121 -0
  74. package/dist/cjs/src/utils/utils.d.ts +1 -0
  75. package/dist/cjs/src/utils/utils.js +18 -0
  76. package/dist/cjs/start.d.ts +1 -0
  77. package/dist/cjs/start.js +12 -0
  78. package/dist/esm/index.d.ts +27 -0
  79. package/dist/esm/index.js +121 -0
  80. package/dist/esm/package.json +1 -0
  81. package/dist/esm/src/assetManager.d.ts +31 -0
  82. package/{src → dist/esm/src}/assetManager.js +22 -60
  83. package/dist/esm/src/assets/routes.d.ts +3 -0
  84. package/{src → dist/esm/src}/assets/routes.js +21 -36
  85. package/dist/esm/src/clusterService.d.ts +40 -0
  86. package/{src → dist/esm/src}/clusterService.js +14 -37
  87. package/dist/esm/src/codeGeneratorManager.d.ts +8 -0
  88. package/{src → dist/esm/src}/codeGeneratorManager.js +15 -24
  89. package/dist/esm/src/config/routes.d.ts +3 -0
  90. package/dist/esm/src/config/routes.js +121 -0
  91. package/dist/esm/src/configManager.d.ts +36 -0
  92. package/{src → dist/esm/src}/configManager.js +11 -40
  93. package/dist/esm/src/containerManager.d.ts +89 -0
  94. package/{src → dist/esm/src}/containerManager.js +81 -182
  95. package/dist/esm/src/filesystem/routes.d.ts +3 -0
  96. package/dist/esm/src/filesystem/routes.js +64 -0
  97. package/dist/esm/src/filesystemManager.d.ts +15 -0
  98. package/{src → dist/esm/src}/filesystemManager.js +20 -28
  99. package/dist/esm/src/identities/routes.d.ts +3 -0
  100. package/dist/esm/src/identities/routes.js +13 -0
  101. package/dist/esm/src/instanceManager.d.ts +56 -0
  102. package/{src → dist/esm/src}/instanceManager.js +94 -175
  103. package/dist/esm/src/instances/routes.d.ts +3 -0
  104. package/{src → dist/esm/src}/instances/routes.js +31 -70
  105. package/dist/esm/src/middleware/cors.d.ts +2 -0
  106. package/{src → dist/esm/src}/middleware/cors.js +2 -3
  107. package/dist/esm/src/middleware/kapeta.d.ts +11 -0
  108. package/{src → dist/esm/src}/middleware/kapeta.js +3 -7
  109. package/dist/esm/src/middleware/stringBody.d.ts +5 -0
  110. package/{src → dist/esm/src}/middleware/stringBody.js +2 -3
  111. package/dist/esm/src/networkManager.d.ts +32 -0
  112. package/{src → dist/esm/src}/networkManager.js +16 -33
  113. package/dist/esm/src/operatorManager.d.ts +36 -0
  114. package/{src → dist/esm/src}/operatorManager.js +35 -91
  115. package/dist/esm/src/progressListener.d.ts +20 -0
  116. package/dist/esm/src/progressListener.js +88 -0
  117. package/dist/esm/src/providerManager.d.ts +9 -0
  118. package/dist/esm/src/providerManager.js +45 -0
  119. package/dist/esm/src/providers/routes.d.ts +3 -0
  120. package/{src → dist/esm/src}/providers/routes.js +10 -16
  121. package/dist/esm/src/proxy/routes.d.ts +3 -0
  122. package/dist/esm/src/proxy/routes.js +106 -0
  123. package/dist/esm/src/proxy/types/rest.d.ts +4 -0
  124. package/dist/esm/src/proxy/types/rest.js +107 -0
  125. package/dist/esm/src/proxy/types/web.d.ts +4 -0
  126. package/{src → dist/esm/src}/proxy/types/web.js +13 -35
  127. package/dist/esm/src/repositoryManager.d.ts +17 -0
  128. package/dist/esm/src/repositoryManager.js +209 -0
  129. package/dist/esm/src/serviceManager.d.ts +29 -0
  130. package/{src → dist/esm/src}/serviceManager.js +12 -42
  131. package/dist/esm/src/socketManager.d.ts +14 -0
  132. package/{src → dist/esm/src}/socketManager.js +19 -23
  133. package/dist/esm/src/storageService.d.ts +17 -0
  134. package/{src → dist/esm/src}/storageService.js +8 -27
  135. package/dist/esm/src/traffic/routes.d.ts +3 -0
  136. package/{src → dist/esm/src}/traffic/routes.js +4 -9
  137. package/dist/esm/src/types.d.ts +88 -0
  138. package/dist/esm/src/types.js +1 -0
  139. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +29 -0
  140. package/{src → dist/esm/src}/utils/BlockInstanceRunner.js +137 -256
  141. package/dist/esm/src/utils/LogData.d.ts +19 -0
  142. package/{src → dist/esm/src}/utils/LogData.js +11 -22
  143. package/dist/esm/src/utils/pathTemplateParser.d.ts +26 -0
  144. package/{src → dist/esm/src}/utils/pathTemplateParser.js +21 -40
  145. package/dist/esm/src/utils/utils.d.ts +1 -0
  146. package/dist/esm/src/utils/utils.js +11 -0
  147. package/dist/esm/start.d.ts +1 -0
  148. package/dist/esm/start.js +7 -0
  149. package/index.ts +147 -0
  150. package/package.json +106 -74
  151. package/src/assetManager.ts +191 -0
  152. package/src/assets/routes.ts +132 -0
  153. package/src/clusterService.ts +134 -0
  154. package/src/codeGeneratorManager.ts +57 -0
  155. package/src/config/routes.ts +159 -0
  156. package/src/configManager.ts +148 -0
  157. package/src/containerManager.ts +466 -0
  158. package/src/filesystem/routes.ts +74 -0
  159. package/src/filesystemManager.ts +93 -0
  160. package/src/identities/routes.ts +20 -0
  161. package/src/instanceManager.ts +503 -0
  162. package/src/instances/routes.ts +164 -0
  163. package/src/middleware/cors.ts +9 -0
  164. package/src/middleware/kapeta.ts +27 -0
  165. package/src/middleware/stringBody.ts +16 -0
  166. package/src/networkManager.ts +137 -0
  167. package/src/operatorManager.ts +221 -0
  168. package/src/progressListener.ts +102 -0
  169. package/src/{providerManager.js → providerManager.ts} +15 -31
  170. package/src/providers/routes.ts +46 -0
  171. package/src/proxy/routes.ts +148 -0
  172. package/src/proxy/types/{rest.js → rest.ts} +30 -30
  173. package/src/proxy/types/web.ts +60 -0
  174. package/src/{repositoryManager.js → repositoryManager.ts} +45 -73
  175. package/src/serviceManager.ts +120 -0
  176. package/src/socketManager.ts +57 -0
  177. package/src/storageService.ts +88 -0
  178. package/src/traffic/routes.ts +18 -0
  179. package/src/types.ts +97 -0
  180. package/src/utils/BlockInstanceRunner.ts +555 -0
  181. package/src/utils/LogData.ts +47 -0
  182. package/src/utils/pathTemplateParser.ts +138 -0
  183. package/src/utils/utils.ts +12 -0
  184. package/start.ts +8 -0
  185. package/tsconfig.json +13 -0
  186. package/index.js +0 -127
  187. package/src/config/routes.js +0 -160
  188. package/src/filesystem/routes.js +0 -74
  189. package/src/identities/routes.js +0 -19
  190. package/src/progressListener.js +0 -82
  191. package/src/proxy/routes.js +0 -126
  192. package/src/utils/utils.js +0 -13
  193. package/start.js +0 -7
@@ -0,0 +1,114 @@
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.proxyRestRequest = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const request_1 = __importDefault(require("request"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const pathTemplateParser_1 = require("../../utils/pathTemplateParser");
11
+ const networkManager_1 = require("../../networkManager");
12
+ const socketManager_1 = require("../../socketManager");
13
+ function getRestMethodId(restResource, httpMethod, httpPath) {
14
+ return lodash_1.default.findKey(restResource.spec.methods, (method) => {
15
+ let methodType = method.method ? method.method.toUpperCase() : 'GET';
16
+ if (methodType.toUpperCase() !== httpMethod.toUpperCase()) {
17
+ return false;
18
+ }
19
+ let path = method.path;
20
+ if (restResource.spec.basePath) {
21
+ path = path_1.default.join(restResource.spec.basePath, path);
22
+ }
23
+ const pathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(path);
24
+ return pathTemplate.matches(httpPath);
25
+ });
26
+ }
27
+ /**
28
+ *
29
+ * @param req {Request}
30
+ * @param opts {ProxyRequestInfo}
31
+ * @return {{consumerMethod: *, providerMethod: *}}
32
+ */
33
+ function resolveMethods(req, opts) {
34
+ const consumerMethodId = getRestMethodId(opts.consumerResource, req.method, opts.consumerPath);
35
+ if (!consumerMethodId) {
36
+ throw new Error(`Consumer method not found for path "${req.method} ${opts.consumerPath}" in resource "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`);
37
+ }
38
+ const consumerMethod = lodash_1.default.cloneDeep(opts.consumerResource.spec.methods[consumerMethodId]);
39
+ if (!consumerMethod) {
40
+ throw new Error(`Consumer method not found for path "${req.method} ${opts.consumerPath}" in resource "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`);
41
+ }
42
+ consumerMethod.id = consumerMethodId;
43
+ const providerMethodId = lodash_1.default.findKey(opts.connection.mapping, (mapping) => {
44
+ return mapping.targetId === consumerMethodId;
45
+ });
46
+ if (!providerMethodId) {
47
+ throw new Error(`Connection contained no mapping for consumer method "${consumerMethodId}`);
48
+ }
49
+ const providerMethod = lodash_1.default.cloneDeep(opts.providerResource.spec.methods[providerMethodId]);
50
+ if (!providerMethod) {
51
+ throw new Error(`Provider method not found "${providerMethodId}" in resource "${opts.connection.provider.blockId}::${opts.connection.provider.resourceName}`);
52
+ }
53
+ providerMethod.id = providerMethodId;
54
+ return {
55
+ consumerMethod,
56
+ providerMethod,
57
+ };
58
+ }
59
+ function proxyRestRequest(req, res, opts) {
60
+ let { consumerMethod, providerMethod } = resolveMethods(req, opts);
61
+ const consumerPathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(consumerMethod.path);
62
+ const providerPathTemplate = (0, pathTemplateParser_1.pathTemplateParser)(providerMethod.path);
63
+ const pathVariables = consumerPathTemplate.parse(opts.consumerPath);
64
+ if (!pathVariables) {
65
+ res.status(400).send({
66
+ error: `Path did not match any patterns: "${opts.consumerPath}"`,
67
+ });
68
+ return;
69
+ }
70
+ let providerPath = providerPathTemplate.create(pathVariables);
71
+ if (!providerPath.startsWith('/')) {
72
+ providerPath = '/' + providerPath;
73
+ }
74
+ const requestHeaders = lodash_1.default.clone(req.headers);
75
+ delete requestHeaders['content-length'];
76
+ delete requestHeaders['content-encoding'];
77
+ delete requestHeaders['connection'];
78
+ delete requestHeaders['host'];
79
+ delete requestHeaders['origin'];
80
+ console.log('Proxy request to provider: %s => %s [rest]', opts.consumerPath, opts.address + providerPath);
81
+ const reqOpts = {
82
+ method: providerMethod.method || 'GET',
83
+ url: opts.address + providerPath,
84
+ body: req.stringBody,
85
+ headers: requestHeaders,
86
+ };
87
+ const traffic = networkManager_1.networkManager.addRequest(req.params.systemId, opts.connection, reqOpts, consumerMethod.id, providerMethod.id);
88
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_start', traffic);
89
+ (0, request_1.default)(reqOpts, function (err, response, responseBody) {
90
+ if (err) {
91
+ traffic.asError(err);
92
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
93
+ res.status(500).send({ error: '' + err });
94
+ return;
95
+ }
96
+ const responseHeaders = lodash_1.default.clone(response.headers);
97
+ delete responseHeaders['content-length'];
98
+ delete responseHeaders['content-encoding'];
99
+ delete responseHeaders['connection'];
100
+ res.set(responseHeaders);
101
+ res.status(response.statusCode);
102
+ traffic.withResponse({
103
+ code: response.statusCode,
104
+ headers: response.headers,
105
+ body: responseBody,
106
+ });
107
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
108
+ if (responseBody) {
109
+ res.write(responseBody);
110
+ }
111
+ res.end();
112
+ });
113
+ }
114
+ exports.proxyRestRequest = proxyRestRequest;
@@ -0,0 +1,4 @@
1
+ import { Response } from 'express';
2
+ import { ProxyRequestInfo } from '../../types';
3
+ import { StringBodyRequest } from '../../middleware/stringBody';
4
+ export declare function proxyWebRequest(req: StringBodyRequest, res: Response, opts: ProxyRequestInfo): void;
@@ -0,0 +1,53 @@
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.proxyWebRequest = void 0;
7
+ const request_1 = __importDefault(require("request"));
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const networkManager_1 = require("../../networkManager");
10
+ const socketManager_1 = require("../../socketManager");
11
+ function proxyWebRequest(req, res, opts) {
12
+ const requestHeaders = lodash_1.default.clone(req.headers);
13
+ delete requestHeaders['content-length'];
14
+ delete requestHeaders['content-encoding'];
15
+ delete requestHeaders['connection'];
16
+ delete requestHeaders['host'];
17
+ delete requestHeaders['origin'];
18
+ const sourceBasePath = opts.consumerResource.spec.path;
19
+ const targetBasePath = opts.providerResource.spec.path;
20
+ let path = opts.consumerPath;
21
+ if (opts.consumerPath.startsWith(sourceBasePath)) {
22
+ path = path.replace(sourceBasePath, targetBasePath);
23
+ }
24
+ console.log('Proxy request to provider: %s => %s%s [web]', opts.consumerPath, opts.address, path);
25
+ const reqOpts = {
26
+ method: req.method,
27
+ url: opts.address + path,
28
+ headers: requestHeaders,
29
+ body: req.stringBody,
30
+ };
31
+ const traffic = networkManager_1.networkManager.addRequest(req.params.systemId, opts.connection, reqOpts);
32
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_start', traffic);
33
+ const proxyReq = (0, request_1.default)(reqOpts);
34
+ proxyReq.on('error', function (err) {
35
+ traffic.asError(err);
36
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
37
+ if (!res.headersSent) {
38
+ res.status(500).send({ error: '' + err });
39
+ }
40
+ });
41
+ proxyReq.on('response', function (response) {
42
+ //TODO: Include the response body in the traffic object when it is not a stream
43
+ traffic.withResponse({
44
+ code: response.statusCode,
45
+ headers: response.headers,
46
+ body: null,
47
+ });
48
+ socketManager_1.socketManager.emit(traffic.connectionId, 'traffic_end', traffic);
49
+ });
50
+ //We need to pipe the proxy response to the client response to handle sockets and event streams
51
+ proxyReq.pipe(res);
52
+ }
53
+ exports.proxyWebRequest = proxyWebRequest;
@@ -0,0 +1,17 @@
1
+ declare class RepositoryManager {
2
+ private changeEventsEnabled;
3
+ private _registryService;
4
+ private _cache;
5
+ private watcher?;
6
+ private _installQueue;
7
+ private _processing;
8
+ constructor();
9
+ setChangeEventsEnabled(enabled: boolean): void;
10
+ listenForChanges(): void;
11
+ stopListening(): void;
12
+ private _install;
13
+ _processNext(): Promise<void>;
14
+ ensureAsset(handle: string, name: string, version: string): Promise<void>;
15
+ }
16
+ export declare const repositoryManager: RepositoryManager;
17
+ export {};
@@ -0,0 +1,215 @@
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.repositoryManager = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
12
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
13
+ const socketManager_1 = require("./socketManager");
14
+ const progressListener_1 = require("./progressListener");
15
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
16
+ const INSTALL_ATTEMPTED = {};
17
+ class RepositoryManager {
18
+ changeEventsEnabled;
19
+ _registryService;
20
+ _cache;
21
+ watcher;
22
+ _installQueue;
23
+ _processing = false;
24
+ constructor() {
25
+ this.changeEventsEnabled = true;
26
+ this.listenForChanges();
27
+ this._registryService = new nodejs_registry_utils_1.RegistryService(nodejs_registry_utils_1.Config.data.registry.url);
28
+ this._cache = {};
29
+ this._installQueue = [];
30
+ }
31
+ setChangeEventsEnabled(enabled) {
32
+ this.changeEventsEnabled = enabled;
33
+ }
34
+ listenForChanges() {
35
+ const baseDir = local_cluster_config_1.default.getRepositoryBasedir();
36
+ if (!node_fs_1.default.existsSync(baseDir)) {
37
+ fs_extra_1.default.mkdirpSync(baseDir);
38
+ }
39
+ let allDefinitions = local_cluster_config_1.default.getDefinitions();
40
+ console.log('Watching local repository for provider changes: %s', baseDir);
41
+ try {
42
+ this.watcher = node_fs_1.default.watch(baseDir, { recursive: true });
43
+ }
44
+ catch (e) {
45
+ // Fallback to run without watch mode due to potential platform issues.
46
+ // https://nodejs.org/docs/latest/api/fs.html#caveats
47
+ console.log('Unable to watch for changes. Changes to assets will not update automatically.');
48
+ return;
49
+ }
50
+ this.watcher.on('change', (eventType, filename) => {
51
+ const [handle, name, version] = filename.toString().split(/\//g);
52
+ if (!name || !version) {
53
+ return;
54
+ }
55
+ if (!this.changeEventsEnabled) {
56
+ return;
57
+ }
58
+ const ymlPath = node_path_1.default.join(baseDir, handle, name, version, 'kapeta.yml');
59
+ const newDefinitions = local_cluster_config_1.default.getDefinitions();
60
+ const newDefinition = newDefinitions.find((d) => d.ymlPath === ymlPath);
61
+ let currentDefinition = allDefinitions.find((d) => d.ymlPath === ymlPath);
62
+ const ymlExists = node_fs_1.default.existsSync(ymlPath);
63
+ let type;
64
+ if (ymlExists) {
65
+ if (currentDefinition) {
66
+ type = 'updated';
67
+ }
68
+ else if (newDefinition) {
69
+ type = 'added';
70
+ currentDefinition = newDefinition;
71
+ }
72
+ else {
73
+ //Other definition was added / updated - ignore
74
+ return;
75
+ }
76
+ }
77
+ else {
78
+ if (currentDefinition) {
79
+ const ref = (0, nodejs_utils_1.parseKapetaUri)(`${currentDefinition.definition.metadata.name}:${currentDefinition.version}`).id;
80
+ delete INSTALL_ATTEMPTED[ref];
81
+ //Something was removed
82
+ type = 'removed';
83
+ }
84
+ else {
85
+ //Other definition was removed - ignore
86
+ return;
87
+ }
88
+ }
89
+ const payload = {
90
+ type,
91
+ definition: currentDefinition?.definition,
92
+ asset: { handle, name, version },
93
+ };
94
+ allDefinitions = newDefinitions;
95
+ socketManager_1.socketManager.emit(`assets`, 'changed', payload);
96
+ });
97
+ }
98
+ stopListening() {
99
+ if (!this.watcher) {
100
+ return;
101
+ }
102
+ this.watcher.close();
103
+ this.watcher = undefined;
104
+ }
105
+ async _install(refs) {
106
+ //We make sure to only install one asset at a time - otherwise unexpected things might happen
107
+ const out = new Promise((resolve, reject) => {
108
+ this._installQueue.push(async () => {
109
+ try {
110
+ const normalizedRefs = refs.map((ref) => (0, nodejs_utils_1.parseKapetaUri)(ref).id);
111
+ const filteredRefs = normalizedRefs.filter((ref) => !INSTALL_ATTEMPTED[ref]);
112
+ console.log(filteredRefs);
113
+ if (filteredRefs.length > 0) {
114
+ filteredRefs.forEach((ref) => (INSTALL_ATTEMPTED[ref] = true));
115
+ //Auto-install missing asset
116
+ try {
117
+ //We change to a temp dir to avoid issues with the current working directory
118
+ process.chdir(node_os_1.default.tmpdir());
119
+ //Disable change events while installing
120
+ this.setChangeEventsEnabled(false);
121
+ socketManager_1.socketManager.emit(`install`, 'install:action', {
122
+ type: 'start',
123
+ refs,
124
+ });
125
+ await nodejs_registry_utils_1.Actions.install(progressListener_1.progressListener, normalizedRefs, {});
126
+ socketManager_1.socketManager.emit(`install`, 'install:action', {
127
+ type: 'done',
128
+ refs,
129
+ });
130
+ }
131
+ catch (e) {
132
+ socketManager_1.socketManager.emit(`install`, 'install:action', {
133
+ type: 'failed',
134
+ refs,
135
+ error: e.message,
136
+ });
137
+ }
138
+ finally {
139
+ this.setChangeEventsEnabled(true);
140
+ }
141
+ }
142
+ resolve();
143
+ }
144
+ catch (e) {
145
+ reject(e);
146
+ }
147
+ finally {
148
+ this._processNext().catch((e) => console.error(e));
149
+ }
150
+ });
151
+ });
152
+ this._processNext().catch((e) => console.error(e));
153
+ return out;
154
+ }
155
+ async _processNext() {
156
+ if (this._processing) {
157
+ return;
158
+ }
159
+ this._processing = true;
160
+ try {
161
+ while (this._installQueue.length > 0) {
162
+ const item = this._installQueue.shift();
163
+ if (item) {
164
+ await item();
165
+ }
166
+ }
167
+ }
168
+ finally {
169
+ this._processing = false;
170
+ }
171
+ }
172
+ async ensureAsset(handle, name, version) {
173
+ const fullName = `${handle}/${name}`;
174
+ const ref = `${fullName}:${version}`;
175
+ if (version === 'local') {
176
+ //TODO: Get dependencies for local asset
177
+ return;
178
+ }
179
+ const definitions = local_cluster_config_1.default.getDefinitions();
180
+ const installedAsset = definitions.find((d) => d.definition.metadata.name === fullName && d.version === version);
181
+ if (installedAsset && this._cache[ref] === true) {
182
+ return;
183
+ }
184
+ if (!installedAsset && this._cache[ref] === false) {
185
+ return;
186
+ }
187
+ let assetVersion;
188
+ try {
189
+ assetVersion = await this._registryService.getVersion(fullName, version);
190
+ if (!assetVersion) {
191
+ this._cache[ref] = false;
192
+ return;
193
+ }
194
+ }
195
+ catch (e) {
196
+ console.warn(`Unable to resolve asset: ${ref}`, e);
197
+ if (installedAsset) {
198
+ return;
199
+ }
200
+ throw e;
201
+ }
202
+ this._cache[ref] = true;
203
+ if (!installedAsset) {
204
+ console.log(`Auto-installing missing asset: ${ref}`);
205
+ await this._install([ref]);
206
+ }
207
+ else {
208
+ //Ensure dependencies are installed
209
+ const refs = assetVersion.dependencies.map((dep) => dep.name);
210
+ console.log(`Auto-installing dependencies: ${refs.join(', ')}`);
211
+ await this._install(refs);
212
+ }
213
+ }
214
+ }
215
+ exports.repositoryManager = new RepositoryManager();
@@ -0,0 +1,29 @@
1
+ import { EnvironmentType } from './types';
2
+ declare class ServiceManager {
3
+ private _systems;
4
+ constructor();
5
+ _forLocal(port: string | number, path?: string, environmentType?: EnvironmentType): string;
6
+ _ensureSystem(systemId: string): any;
7
+ _ensureService(systemId: string, serviceId: string): any;
8
+ ensureServicePort(systemId: string, blockInstanceId: string, portType?: string): Promise<any>;
9
+ _save(): void;
10
+ /**
11
+ * Gets the consumable address of a service block resource
12
+ *
13
+ * This returns a local proxy path to allow traffic inspection and control.
14
+ *
15
+ */
16
+ getConsumerAddress(systemId: string, consumerInstanceId: string, consumerResourceName: string, portType: string, environmentType?: EnvironmentType): string;
17
+ /**
18
+ * Gets the direct address of a service block
19
+ *
20
+ * This returns the actual endpoint address of a service that we're talking to.
21
+ * For local services this address will be on localhost - for remote services it will
22
+ * be their remotely available address.
23
+ *
24
+ */
25
+ getProviderAddress(systemId: string, providerInstanceId: string, portType: string): Promise<string>;
26
+ getServices(): any;
27
+ }
28
+ export declare const serviceManager: ServiceManager;
29
+ export {};
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.serviceManager = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const clusterService_1 = require("./clusterService");
9
+ const storageService_1 = require("./storageService");
10
+ const DEFAULT_PORT_TYPE = 'rest';
11
+ class ServiceManager {
12
+ _systems;
13
+ constructor() {
14
+ this._systems = storageService_1.storageService.get('services');
15
+ if (!this._systems) {
16
+ this._systems = {};
17
+ }
18
+ lodash_1.default.forEach(this._systems, (system) => {
19
+ lodash_1.default.forEach(system, (services) => {
20
+ lodash_1.default.forEach(services, (portInfo) => {
21
+ clusterService_1.clusterService.reservePort(portInfo.port);
22
+ });
23
+ });
24
+ });
25
+ }
26
+ _forLocal(port, path, environmentType) {
27
+ if (!path) {
28
+ path = '';
29
+ }
30
+ let host;
31
+ if (environmentType === 'docker') {
32
+ //We're inside a docker container, so we can use this special host name to access the host machine
33
+ host = 'host.docker.internal';
34
+ }
35
+ else {
36
+ host = clusterService_1.clusterService.getClusterServiceHost();
37
+ }
38
+ if (path.startsWith('/')) {
39
+ path = path.substring(1);
40
+ }
41
+ return `http://${host}:${port}/${path}`;
42
+ }
43
+ _ensureSystem(systemId) {
44
+ if (!this._systems[systemId]) {
45
+ this._systems[systemId] = {};
46
+ }
47
+ return this._systems[systemId];
48
+ }
49
+ _ensureService(systemId, serviceId) {
50
+ const system = this._ensureSystem(systemId);
51
+ if (!system[serviceId]) {
52
+ system[serviceId] = {};
53
+ }
54
+ return system[serviceId];
55
+ }
56
+ async ensureServicePort(systemId, blockInstanceId, portType = DEFAULT_PORT_TYPE) {
57
+ if (!portType) {
58
+ portType = DEFAULT_PORT_TYPE;
59
+ }
60
+ const service = this._ensureService(systemId, blockInstanceId);
61
+ if (!service[portType]) {
62
+ const port = await clusterService_1.clusterService.getNextAvailablePort();
63
+ service[portType] = { port };
64
+ this._save();
65
+ }
66
+ const portTypeSection = service[portType];
67
+ return portTypeSection.port;
68
+ }
69
+ _save() {
70
+ storageService_1.storageService.put('services', this._systems);
71
+ }
72
+ /**
73
+ * Gets the consumable address of a service block resource
74
+ *
75
+ * This returns a local proxy path to allow traffic inspection and control.
76
+ *
77
+ */
78
+ getConsumerAddress(systemId, consumerInstanceId, consumerResourceName, portType, environmentType) {
79
+ const port = clusterService_1.clusterService.getClusterServicePort();
80
+ const path = clusterService_1.clusterService.getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType);
81
+ return this._forLocal(port, path, environmentType);
82
+ }
83
+ /**
84
+ * Gets the direct address of a service block
85
+ *
86
+ * This returns the actual endpoint address of a service that we're talking to.
87
+ * For local services this address will be on localhost - for remote services it will
88
+ * be their remotely available address.
89
+ *
90
+ */
91
+ async getProviderAddress(systemId, providerInstanceId, portType) {
92
+ const port = await this.ensureServicePort(systemId, providerInstanceId, portType);
93
+ return this._forLocal(port);
94
+ }
95
+ getServices() {
96
+ return this._systems;
97
+ }
98
+ }
99
+ exports.serviceManager = new ServiceManager();
@@ -0,0 +1,14 @@
1
+ import { Socket, Server } from 'socket.io';
2
+ export declare class SocketManager {
3
+ private _io;
4
+ private _sockets;
5
+ constructor();
6
+ setIo(io: Server): void;
7
+ private get io();
8
+ emit(context: string, type: string, payload: any): void;
9
+ _bindIO(): void;
10
+ _handleSocketCreated(socket: Socket): void;
11
+ _bindSocket(socket: Socket): void;
12
+ _handleSocketDestroyed(socket: Socket): void;
13
+ }
14
+ export declare const socketManager: SocketManager;
@@ -0,0 +1,53 @@
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.socketManager = exports.SocketManager = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ class SocketManager {
9
+ _io;
10
+ _sockets;
11
+ constructor() {
12
+ this._io = null;
13
+ this._sockets = [];
14
+ return this;
15
+ }
16
+ setIo(io) {
17
+ console.log('Socket server ready');
18
+ this._io = io;
19
+ this._bindIO();
20
+ }
21
+ get io() {
22
+ if (!this._io) {
23
+ throw new Error('Socket server not ready');
24
+ }
25
+ return this._io;
26
+ }
27
+ emit(context, type, payload) {
28
+ this.io.to(context).emit(type, { context, payload });
29
+ }
30
+ _bindIO() {
31
+ this.io.on('connection', (socket) => this._handleSocketCreated(socket));
32
+ }
33
+ _handleSocketCreated(socket) {
34
+ this._bindSocket(socket);
35
+ this._sockets.push(socket);
36
+ }
37
+ _bindSocket(socket) {
38
+ socket.on('disconnect', () => this._handleSocketDestroyed(socket));
39
+ socket.on('join', (id) => {
40
+ console.log('socket joined ', id);
41
+ socket.join(id);
42
+ });
43
+ socket.on('leave', (id) => {
44
+ console.log('socket left ', id);
45
+ socket.leave(id);
46
+ });
47
+ }
48
+ _handleSocketDestroyed(socket) {
49
+ lodash_1.default.pull(this._sockets, socket);
50
+ }
51
+ }
52
+ exports.SocketManager = SocketManager;
53
+ exports.socketManager = new SocketManager();
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Class that handles reading and writing from local configuration file.
3
+ */
4
+ declare class StorageService {
5
+ private _data;
6
+ constructor();
7
+ getKapetaBasedir(): string;
8
+ _readConfig(): import("@kapeta/local-cluster-config").ClusterConfig;
9
+ _writeConfig(): void;
10
+ section<T = any>(section: string, defaultValue?: any): T;
11
+ put(section: string, property: string | any, value?: any): void;
12
+ get(section: string, property?: string): any;
13
+ contains(section: string, property: string): any;
14
+ ensure(section: string, property: string, value: any): any;
15
+ }
16
+ export declare const storageService: StorageService;
17
+ export {};