@kapeta/local-cluster-service 0.6.1 → 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 (192) 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 +7 -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/{src → dist/esm/src}/config/routes.js +40 -89
  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 +88 -179
  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/filesystem/routes.js +0 -74
  188. package/src/identities/routes.js +0 -19
  189. package/src/progressListener.js +0 -82
  190. package/src/proxy/routes.js +0 -126
  191. package/src/utils/utils.js +0 -13
  192. package/start.js +0 -7
@@ -0,0 +1,138 @@
1
+ import { StringMap } from '../types';
2
+
3
+ const TYPE_VARIABLE = 'variable';
4
+ const TYPE_PATH = 'path';
5
+
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 class PathTemplate {
18
+ private _path: string;
19
+ private _parts: { type: 'variable' | 'path'; value: string; regex?: RegExp }[] = [];
20
+
21
+ constructor(pathTemplate: string) {
22
+ if (!pathTemplate.startsWith('/')) {
23
+ pathTemplate = '/' + pathTemplate;
24
+ }
25
+ this._path = pathTemplate;
26
+
27
+ const variableRegex = /{([^}]+)}/g;
28
+ let match,
29
+ offset = 0;
30
+ this._parts = [];
31
+ while ((match = variableRegex.exec(pathTemplate)) !== null) {
32
+ if (match.index > offset) {
33
+ this._parts.push({
34
+ type: TYPE_PATH,
35
+ value: pathTemplate.substring(offset, match.index),
36
+ });
37
+ }
38
+
39
+ let regex;
40
+ let value = match[1];
41
+ [value, regex] = value.split(/:/, 2);
42
+
43
+ if (regex) {
44
+ regex = new RegExp('^' + regex);
45
+ } else {
46
+ regex = /^[^\/]+/;
47
+ }
48
+
49
+ this._parts.push({
50
+ type: TYPE_VARIABLE,
51
+ value,
52
+ regex,
53
+ });
54
+ offset = match.index + match[0].length;
55
+ }
56
+
57
+ if (offset < pathTemplate.length) {
58
+ this._parts.push({
59
+ type: TYPE_PATH,
60
+ value: pathTemplate.substring(offset),
61
+ });
62
+ }
63
+ }
64
+
65
+ get path() {
66
+ return this._path;
67
+ }
68
+
69
+ matches(path: string) {
70
+ return this.parse(path) !== null;
71
+ }
72
+
73
+ parse(path: string) {
74
+ if (!path.startsWith('/')) {
75
+ path = '/' + path;
76
+ }
77
+
78
+ const values: StringMap = {};
79
+
80
+ for (let i = 0; i < this._parts.length; i++) {
81
+ const part = this._parts[i];
82
+ switch (part.type) {
83
+ case TYPE_PATH:
84
+ if (!path.startsWith(part.value)) {
85
+ return null;
86
+ }
87
+
88
+ path = path.substring(part.value.length);
89
+ break;
90
+ case TYPE_VARIABLE:
91
+ if (!part.regex?.test(path)) {
92
+ return null;
93
+ }
94
+
95
+ const newPath = path.replace(part.regex, '');
96
+ const value = path.substr(0, path.length - newPath.length);
97
+ values[part.value] = value;
98
+ path = newPath;
99
+ break;
100
+ }
101
+ }
102
+
103
+ if (path && path !== '/') {
104
+ //We did not match all of it
105
+ return null;
106
+ }
107
+
108
+ return values;
109
+ }
110
+
111
+ create(variables: StringMap) {
112
+ return this._parts
113
+ .map((part) => {
114
+ switch (part.type) {
115
+ case TYPE_PATH:
116
+ return part.value;
117
+ case TYPE_VARIABLE:
118
+ if (variables[part.value] === undefined || variables[part.value] === null) {
119
+ return '';
120
+ }
121
+
122
+ return variables[part.value];
123
+ }
124
+ })
125
+ .join('');
126
+ }
127
+
128
+ toString() {
129
+ return 'tmpl: ' + this.path;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Parses a path into a RESTPath
135
+ */
136
+ export function pathTemplateParser(path: string) {
137
+ return new PathTemplate(path);
138
+ }
@@ -0,0 +1,12 @@
1
+ import FS from 'node:fs';
2
+ import YAML from 'yaml';
3
+
4
+ export function readYML(path: string) {
5
+ const rawYaml = FS.readFileSync(path);
6
+
7
+ try {
8
+ return YAML.parse(rawYaml.toString());
9
+ } catch (err) {
10
+ throw new Error('Failed to parse plan YAML: ' + err);
11
+ }
12
+ }
package/start.ts ADDED
@@ -0,0 +1,8 @@
1
+ import localClusterService from './index';
2
+
3
+ localClusterService
4
+ .start()
5
+ .then(({ host, port }) => console.log('Listening on port %s:%s', host, port))
6
+ .catch((e) => {
7
+ console.error('Failed to start local cluster due to an error:\n\t - %s', e.toString());
8
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "@tsconfig/node18/tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "declaration": true,
6
+ "esModuleInterop": true
7
+ },
8
+ "ts-node": {
9
+ "files": true
10
+ },
11
+ "include": ["definitions.d.ts", "src/**/*", "index.ts", "start.ts"],
12
+ "exclude": ["node_modules", "dist"]
13
+ }
package/index.js DELETED
@@ -1,127 +0,0 @@
1
- const clusterService = require('./src/clusterService');
2
- const storageService = require('./src/storageService');
3
- const serviceManager = require('./src/serviceManager');
4
- const socketManager = require('./src/socketManager');
5
- const containerManager = require('./src/containerManager');
6
- const express = require('express');
7
- const HTTP = require('http');
8
- const {Server} = require("socket.io");
9
-
10
- let currentServer = null;
11
-
12
- function createServer() {
13
- const app = express();
14
- app.use('/traffic', require('./src/traffic/routes'));
15
- app.use('/proxy', require('./src/proxy/routes'));
16
- app.use('/config', require('./src/config/routes'));
17
- app.use('/instances', require('./src/instances/routes'));
18
- app.use('/identities', require('./src/identities/routes'));
19
- app.use('/files', require('./src/filesystem/routes'));
20
- app.use('/assets', require('./src/assets/routes'));
21
- app.use('/providers', require('./src/providers/routes'));
22
- app.use('/', (err, req, res, next) => {
23
- console.error('Request failed: %s %s', req.method, req.originalUrl, err);
24
- res.status(500).send({
25
- ok: false,
26
- error: err.error ?? err.message
27
- })
28
- });
29
- const server = HTTP.createServer(app);
30
-
31
- //socket
32
- const io = new Server(server, {
33
- cors: {
34
- //TODO: This should'nt be hardcoded but also shouldn't be "*"
35
- origin: "http://localhost:8080"
36
- }
37
- });
38
- socketManager.setIo(io);
39
- return server;
40
- }
41
-
42
- module.exports = {
43
-
44
- isRunning: function() {
45
- return !!currentServer;
46
- },
47
-
48
- getCurrentPort: function() {
49
- if (!currentServer) {
50
- return -1;
51
- }
52
-
53
- return currentServer.port;
54
- },
55
-
56
- /**
57
- * Starts the local cluster service.
58
- * @return {Promise<{ host: string, port: nubmer, dockerStatus: boolean}>} resolves when listening is done with port number. Rejects if listening failed.
59
- */
60
- start: async function() {
61
- if (currentServer) {
62
- throw new Error('Server already started');
63
- }
64
-
65
- try {
66
- await containerManager.initialize()
67
- } catch (e) {
68
- console.error('Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.');
69
- }
70
-
71
- const clusterPort = storageService.get('cluster','port');
72
- if (clusterPort) {
73
- clusterService.setClusterServicePort(clusterPort);
74
- }
75
-
76
- const clusterHost = storageService.get('cluster','host');
77
- if (clusterHost) {
78
- clusterService.setClusterServiceHost(clusterHost);
79
- }
80
-
81
- await clusterService.init();
82
-
83
- currentServer = createServer();
84
-
85
- const port = clusterService.getClusterServicePort();
86
-
87
- const host = clusterService.getClusterServiceHost();
88
-
89
- if (clusterPort !== port) {
90
- storageService.put('cluster','port', port);
91
- }
92
-
93
- if (clusterHost !== host) {
94
- storageService.put('cluster','host', host);
95
- }
96
-
97
- return new Promise((resolve, reject) => {
98
-
99
- currentServer.once('error', (err) => {
100
- currentServer.close();
101
- currentServer = null;
102
- reject(err);
103
- });
104
-
105
- currentServer.listen(port, host, () => resolve({host,port, dockerStatus: containerManager.isAlive()}));
106
- currentServer.host = host;
107
- currentServer.port = port;
108
- });
109
- },
110
-
111
- /**
112
- * Stops any currently running cluster services.
113
- * @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
114
- */
115
- stop: function() {
116
- if (currentServer) {
117
- return new Promise(function(resolve) {
118
- currentServer.close(() => resolve(true));
119
- currentServer = null;
120
- });
121
- }
122
-
123
- return Promise.resolve(false);
124
- },
125
- getServices: () => serviceManager.getServices()
126
- };
127
-
@@ -1,74 +0,0 @@
1
- const Router = require('express-promise-router').default;
2
- const stringBodyMiddleware = require('../middleware/stringBody');
3
- const fileManager = require('../filesystemManager');
4
-
5
- let router = new Router();
6
-
7
- router.use('/', require('../middleware/cors'));
8
-
9
- router.get('/root', (req, res) => {
10
- res.send(fileManager.getRootFolder());
11
- });
12
-
13
- router.get('/project/root', (req, res) => {
14
- res.send(fileManager.getProjectRootFolder());
15
- });
16
-
17
- router.use('/project/root', stringBodyMiddleware);
18
- router.post('/project/root', (req, res) => {
19
- fileManager.setProjectRootFolder(req.stringBody);
20
- res.sendStatus(204);
21
- });
22
-
23
-
24
- router.use("/",(req,res,next)=>{
25
- if (!req.query.path) {
26
- res.status(400).send({ error: 'Missing required query parameter "path"' });
27
- return;
28
- }
29
- next();
30
- });
31
-
32
-
33
- router.get('/list', async (req, res) => {
34
- let pathArg = req.query.path;
35
-
36
- try {
37
- res.send(await fileManager.readDirectory(pathArg))
38
- } catch (err) {
39
- res.status(400).send({error:''+err});
40
- }
41
-
42
- });
43
-
44
- router.get('/readfile', async (req, res) => {
45
- let pathArg = req.query.path;
46
- try {
47
- res.send(await fileManager.readFile(pathArg));
48
- } catch (err) {
49
- res.status(400).send({error:''+err});
50
- }
51
- });
52
-
53
- router.put('/mkdir', async (req, res) => {
54
- let pathArg = req.query.path;
55
- try {
56
- await fileManager.createFolder(pathArg);
57
- res.sendStatus(204);
58
- } catch (err) {
59
- res.status(400).send({error:''+err});
60
- }
61
- });
62
-
63
- router.use('/writefile', stringBodyMiddleware);
64
- router.post('/writefile', async (req, res) => {
65
- let pathArg = req.query.path;
66
- try {
67
- await fileManager.writeFile(pathArg, req.stringBody);
68
- res.sendStatus(204);
69
- } catch (err) {
70
- res.status(400).send({error:''+err});
71
- }
72
- });
73
-
74
- module.exports = router;
@@ -1,19 +0,0 @@
1
- const Router = require('express-promise-router').default;
2
- const {KapetaAPI} = require('@kapeta/nodejs-api-client');
3
-
4
- const instanceManager = require('../instanceManager');
5
-
6
- const router = new Router();
7
- const api = new KapetaAPI();
8
-
9
- router.use('/', require('../middleware/cors'));
10
-
11
- router.get('/current', async (req, res) => {
12
- res.send(await api.getCurrentIdentity());
13
- });
14
-
15
- router.get('/:identityId/memberships', async (req, res) => {
16
- res.send(await api.getMemberships(req.params.identityId));
17
- });
18
-
19
- module.exports = router;
@@ -1,82 +0,0 @@
1
- const {spawn} = require("child_process");
2
- const socketManager = require("./socketManager");
3
- /**
4
- *
5
- * @type {ProgressListener}
6
- */
7
- module.exports = {
8
- run: (command, directory) => {
9
- socketManager.emit(
10
- `install`,
11
- 'install:log',
12
- {
13
- type: 'info',
14
- message: `Running command "${command}"`
15
- }
16
- );
17
-
18
- return new Promise((resolve, reject) => {
19
- const child = spawn(command, {
20
- cwd: directory ? directory : process.cwd(),
21
- detached: true,
22
- shell: true
23
- });
24
-
25
- child.stdout.on('data', (data) => {
26
- socketManager.emit(`install`, 'install:log', {type: 'info', message: data.toString()});
27
- });
28
-
29
- child.stderr.on('data', (data) => {
30
- socketManager.emit(`install`, 'install:log', {type: 'info', message: data.toString()});
31
- });
32
-
33
- child.on('exit', (exit, signal) => {
34
- if (exit !== 0) {
35
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `"${command}" failed: "${exit}"`});
36
- reject(new Error(`Command "${command}" exited with code ${exit}`));
37
- } else {
38
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `Command OK: "${command}"`});
39
- resolve({exit, signal});
40
- }
41
- });
42
-
43
- child.on('error', (err) => {
44
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `"${command}" failed: "${err.message}"`});
45
- reject(err);
46
- });
47
- });
48
- },
49
- progress: async (label, callback) => {
50
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `${label}: started`});
51
- try {
52
- const result = await callback();
53
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `${label}: done`});
54
- return result;
55
- } catch (e) {
56
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `${label}: failed. ${e.message}`});
57
- throw e;
58
- }
59
- },
60
- check: async (message, ok) => {
61
- const wasOk = await ok;
62
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `${message}: ${wasOk}`});
63
- },
64
- start: (label) => {
65
- socketManager.emit(`install`, 'install:log', {type: 'info', message: label});
66
- },
67
- showValue: (label, value) => {
68
- socketManager.emit(`install`, 'install:log', {type: 'info', message: `${label}: ${value}`});
69
- },
70
- error: (msg, ...args) => {
71
- socketManager.emit(`install`, 'install:log', {type: 'error', message: msg});
72
- },
73
- warn: (msg, ...args) => {
74
- socketManager.emit(`install`, 'install:log', {type: 'warn', message: msg});
75
- },
76
- info: (msg, ...args) => {
77
- socketManager.emit(`install`, 'install:log', {type: 'info', message: msg});
78
- },
79
- debug: (msg, ...args) => {
80
- socketManager.emit(`install`, 'install:log', {type: 'debug', message: msg});
81
- },
82
- }
@@ -1,126 +0,0 @@
1
- const Router = require('express-promise-router').default;
2
- const _ = require('lodash');
3
-
4
- const router = new Router();
5
- const serviceManager = require('../serviceManager');
6
- const clusterService = require('../clusterService');
7
- const assetManager = require('../assetManager');
8
-
9
- /**
10
- * @var {{[key:string]:ProxyRequestHandler}}
11
- */
12
- const TYPE_HANDLERS = {
13
- rest: require('./types/rest'),
14
- web: require('./types/web')
15
- };
16
-
17
- function getResource(resources, resourceName) {
18
- return _.find(resources, (resource) => {
19
- return (resource.metadata.name.toLowerCase() === resourceName.toLowerCase());
20
- });
21
- }
22
-
23
- router.use('/:systemId/:consumerInstanceId/:consumerResourceName', require('../middleware/stringBody'));
24
-
25
- router.all('/:systemId/:consumerInstanceId/:consumerResourceName/:type/*', async (req, res) => {
26
-
27
- try {
28
-
29
- const typeHandler = TYPE_HANDLERS[req.params.type.toLowerCase()];
30
- if (!typeHandler) {
31
- res.status(401).send({error: 'Unknown connection type: ' + req.params.type});
32
- return;
33
- }
34
-
35
- const plan = await assetManager.getPlan(req.params.systemId);
36
-
37
- // We can find the connection by the consumer information alone since
38
- // only 1 provider can be connected to a consumer resource at a time
39
- const connection = _.find(plan.spec.connections, (connection) => {
40
- return connection.consumer.blockId.toLowerCase() === req.params.consumerInstanceId.toLowerCase() &&
41
- connection.consumer.resourceName.toLowerCase() === req.params.consumerResourceName.toLowerCase();
42
- });
43
-
44
- if (!connection) {
45
- res.status(401).send({error:`No connection found for consumer "${req.params.consumerInstanceId}::${req.params.consumerResourceName}"`});
46
- return;
47
- }
48
-
49
- const toBlockInstance = _.find(plan.spec.blocks, (blockInstance) => {
50
- return blockInstance.id.toLowerCase() === connection.consumer.blockId.toLowerCase();
51
- });
52
-
53
- if (!toBlockInstance) {
54
- res.status(401).send({error:`Block instance not found "${req.params.consumerInstanceId}`});
55
- return;
56
- }
57
-
58
- const toBlockAsset = await assetManager.getAsset(toBlockInstance.block.ref);
59
-
60
- const consumerResource = getResource(toBlockAsset.data.spec.consumers, req.params.consumerResourceName);
61
-
62
- if (!consumerResource) {
63
- res.status(401).send({error:`Block resource not found "${req.params.consumerInstanceId}::${req.params.consumerResourceName}`});
64
- return;
65
- }
66
-
67
- const basePath = clusterService.getProxyPath(
68
- req.params.systemId,
69
- req.params.consumerInstanceId,
70
- req.params.consumerResourceName,
71
- req.params.type
72
- );
73
-
74
- const fromBlockInstance = _.find(plan.spec.blocks, (blockInstance) => {
75
- return blockInstance.id.toLowerCase() === connection.provider.blockId.toLowerCase();
76
- });
77
-
78
- if (!fromBlockInstance) {
79
- res.status(401).send({error:`Block instance not found "${connection.provider.blockId}`});
80
- return;
81
- }
82
-
83
- const fromBlockAsset = await assetManager.getAsset(fromBlockInstance.block.ref);
84
-
85
- const providerResource = getResource(fromBlockAsset.data.spec.providers, connection.provider.resourceName);
86
-
87
- if (!providerResource) {
88
- res.status(401).send({error:`Block resource not found "${connection.provider.blockId}::${connection.provider.resourceName}`});
89
- return;
90
- }
91
-
92
-
93
- //Get target address
94
- let address = await serviceManager.getProviderAddress(
95
- req.params.systemId,
96
- connection.provider.blockId,
97
- req.params.type
98
- );
99
-
100
- while(address.endsWith('/')) {
101
- address = address.substring(0, address.length - 1);
102
- }
103
-
104
- /*
105
- Get the path the consumer requested.
106
- Note that this might not match the path the destination is expecting so we need to identify the method
107
- that is being called and identify the destination path from the connection.
108
- */
109
- const consumerPath = req.originalUrl.substring(basePath.length - 1);
110
-
111
- typeHandler(req, res, {
112
- consumerPath,
113
- address,
114
- consumerResource,
115
- providerResource,
116
- connection
117
- });
118
-
119
- } catch(err) {
120
- console.warn("Failed to process proxy request", err);
121
- res.status(400).send({error: err.message});
122
- }
123
-
124
- });
125
-
126
- module.exports = router;
@@ -1,13 +0,0 @@
1
- const FS = require("node:fs");
2
- const YAML = require("yaml");
3
-
4
-
5
- exports.readYML = function readYML(path) {
6
- let rawYaml = FS.readFileSync(path);
7
-
8
- try {
9
- return YAML.parse(rawYaml.toString());
10
- } catch(err) {
11
- throw new Error('Failed to parse plan YAML: ' + err);
12
- }
13
- }
package/start.js DELETED
@@ -1,7 +0,0 @@
1
- const localClusterService = require('./index.js');
2
-
3
- localClusterService.start()
4
- .then(({host,port}) => console.log('Listening on port %s:%s', host, port))
5
- .catch(e => {
6
- console.error('Failed to start local cluster due to an error:\n\t - %s', e.toString())
7
- });