@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.
- package/.eslintrc.cjs +17 -0
- package/.github/workflows/main.yml +22 -22
- package/.prettierignore +4 -0
- package/.vscode/launch.json +2 -4
- package/CHANGELOG.md +14 -0
- package/definitions.d.ts +17 -35
- package/dist/cjs/index.d.ts +27 -0
- package/dist/cjs/index.js +126 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/assetManager.d.ts +31 -0
- package/dist/cjs/src/assetManager.js +153 -0
- package/dist/cjs/src/assets/routes.d.ts +3 -0
- package/dist/cjs/src/assets/routes.js +117 -0
- package/dist/cjs/src/clusterService.d.ts +40 -0
- package/dist/cjs/src/clusterService.js +114 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +8 -0
- package/dist/cjs/src/codeGeneratorManager.js +53 -0
- package/dist/cjs/src/config/routes.d.ts +3 -0
- package/dist/cjs/src/config/routes.js +126 -0
- package/dist/cjs/src/configManager.d.ts +36 -0
- package/dist/cjs/src/configManager.js +110 -0
- package/dist/cjs/src/containerManager.d.ts +89 -0
- package/dist/cjs/src/containerManager.js +365 -0
- package/dist/cjs/src/filesystem/routes.d.ts +3 -0
- package/dist/cjs/src/filesystem/routes.js +69 -0
- package/dist/cjs/src/filesystemManager.d.ts +15 -0
- package/dist/cjs/src/filesystemManager.js +87 -0
- package/dist/cjs/src/identities/routes.d.ts +3 -0
- package/dist/cjs/src/identities/routes.js +18 -0
- package/dist/cjs/src/instanceManager.d.ts +56 -0
- package/dist/cjs/src/instanceManager.js +424 -0
- package/dist/cjs/src/instances/routes.d.ts +3 -0
- package/dist/cjs/src/instances/routes.js +134 -0
- package/dist/cjs/src/middleware/cors.d.ts +2 -0
- package/dist/cjs/src/middleware/cors.js +10 -0
- package/dist/cjs/src/middleware/kapeta.d.ts +11 -0
- package/dist/cjs/src/middleware/kapeta.js +17 -0
- package/dist/cjs/src/middleware/stringBody.d.ts +5 -0
- package/dist/cjs/src/middleware/stringBody.js +14 -0
- package/dist/cjs/src/networkManager.d.ts +32 -0
- package/dist/cjs/src/networkManager.js +109 -0
- package/dist/cjs/src/operatorManager.d.ts +36 -0
- package/dist/cjs/src/operatorManager.js +165 -0
- package/dist/cjs/src/progressListener.d.ts +20 -0
- package/dist/cjs/src/progressListener.js +91 -0
- package/dist/cjs/src/providerManager.d.ts +9 -0
- package/dist/cjs/src/providerManager.js +51 -0
- package/dist/cjs/src/providers/routes.d.ts +3 -0
- package/dist/cjs/src/providers/routes.js +42 -0
- package/dist/cjs/src/proxy/routes.d.ts +3 -0
- package/dist/cjs/src/proxy/routes.js +111 -0
- package/dist/cjs/src/proxy/types/rest.d.ts +4 -0
- package/dist/cjs/src/proxy/types/rest.js +114 -0
- package/dist/cjs/src/proxy/types/web.d.ts +4 -0
- package/dist/cjs/src/proxy/types/web.js +53 -0
- package/dist/cjs/src/repositoryManager.d.ts +17 -0
- package/dist/cjs/src/repositoryManager.js +215 -0
- package/dist/cjs/src/serviceManager.d.ts +29 -0
- package/dist/cjs/src/serviceManager.js +99 -0
- package/dist/cjs/src/socketManager.d.ts +14 -0
- package/dist/cjs/src/socketManager.js +53 -0
- package/dist/cjs/src/storageService.d.ts +17 -0
- package/dist/cjs/src/storageService.js +74 -0
- package/dist/cjs/src/traffic/routes.d.ts +3 -0
- package/dist/cjs/src/traffic/routes.js +18 -0
- package/dist/cjs/src/types.d.ts +88 -0
- package/dist/cjs/src/types.js +2 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +29 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +468 -0
- package/dist/cjs/src/utils/LogData.d.ts +19 -0
- package/dist/cjs/src/utils/LogData.js +43 -0
- package/dist/cjs/src/utils/pathTemplateParser.d.ts +26 -0
- package/dist/cjs/src/utils/pathTemplateParser.js +121 -0
- package/dist/cjs/src/utils/utils.d.ts +1 -0
- package/dist/cjs/src/utils/utils.js +18 -0
- package/dist/cjs/start.d.ts +1 -0
- package/dist/cjs/start.js +12 -0
- package/dist/esm/index.d.ts +27 -0
- package/dist/esm/index.js +121 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/assetManager.d.ts +31 -0
- package/{src → dist/esm/src}/assetManager.js +22 -60
- package/dist/esm/src/assets/routes.d.ts +3 -0
- package/{src → dist/esm/src}/assets/routes.js +21 -36
- package/dist/esm/src/clusterService.d.ts +40 -0
- package/{src → dist/esm/src}/clusterService.js +14 -37
- package/dist/esm/src/codeGeneratorManager.d.ts +8 -0
- package/{src → dist/esm/src}/codeGeneratorManager.js +15 -24
- package/dist/esm/src/config/routes.d.ts +3 -0
- package/dist/esm/src/config/routes.js +121 -0
- package/dist/esm/src/configManager.d.ts +36 -0
- package/{src → dist/esm/src}/configManager.js +11 -40
- package/dist/esm/src/containerManager.d.ts +89 -0
- package/{src → dist/esm/src}/containerManager.js +81 -182
- package/dist/esm/src/filesystem/routes.d.ts +3 -0
- package/dist/esm/src/filesystem/routes.js +64 -0
- package/dist/esm/src/filesystemManager.d.ts +15 -0
- package/{src → dist/esm/src}/filesystemManager.js +20 -28
- package/dist/esm/src/identities/routes.d.ts +3 -0
- package/dist/esm/src/identities/routes.js +13 -0
- package/dist/esm/src/instanceManager.d.ts +56 -0
- package/{src → dist/esm/src}/instanceManager.js +94 -175
- package/dist/esm/src/instances/routes.d.ts +3 -0
- package/{src → dist/esm/src}/instances/routes.js +31 -70
- package/dist/esm/src/middleware/cors.d.ts +2 -0
- package/{src → dist/esm/src}/middleware/cors.js +2 -3
- package/dist/esm/src/middleware/kapeta.d.ts +11 -0
- package/{src → dist/esm/src}/middleware/kapeta.js +3 -7
- package/dist/esm/src/middleware/stringBody.d.ts +5 -0
- package/{src → dist/esm/src}/middleware/stringBody.js +2 -3
- package/dist/esm/src/networkManager.d.ts +32 -0
- package/{src → dist/esm/src}/networkManager.js +16 -33
- package/dist/esm/src/operatorManager.d.ts +36 -0
- package/{src → dist/esm/src}/operatorManager.js +35 -91
- package/dist/esm/src/progressListener.d.ts +20 -0
- package/dist/esm/src/progressListener.js +88 -0
- package/dist/esm/src/providerManager.d.ts +9 -0
- package/dist/esm/src/providerManager.js +45 -0
- package/dist/esm/src/providers/routes.d.ts +3 -0
- package/{src → dist/esm/src}/providers/routes.js +10 -16
- package/dist/esm/src/proxy/routes.d.ts +3 -0
- package/dist/esm/src/proxy/routes.js +106 -0
- package/dist/esm/src/proxy/types/rest.d.ts +4 -0
- package/dist/esm/src/proxy/types/rest.js +107 -0
- package/dist/esm/src/proxy/types/web.d.ts +4 -0
- package/{src → dist/esm/src}/proxy/types/web.js +13 -35
- package/dist/esm/src/repositoryManager.d.ts +17 -0
- package/dist/esm/src/repositoryManager.js +209 -0
- package/dist/esm/src/serviceManager.d.ts +29 -0
- package/{src → dist/esm/src}/serviceManager.js +12 -42
- package/dist/esm/src/socketManager.d.ts +14 -0
- package/{src → dist/esm/src}/socketManager.js +19 -23
- package/dist/esm/src/storageService.d.ts +17 -0
- package/{src → dist/esm/src}/storageService.js +8 -27
- package/dist/esm/src/traffic/routes.d.ts +3 -0
- package/{src → dist/esm/src}/traffic/routes.js +4 -9
- package/dist/esm/src/types.d.ts +88 -0
- package/dist/esm/src/types.js +1 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +29 -0
- package/{src → dist/esm/src}/utils/BlockInstanceRunner.js +137 -256
- package/dist/esm/src/utils/LogData.d.ts +19 -0
- package/{src → dist/esm/src}/utils/LogData.js +11 -22
- package/dist/esm/src/utils/pathTemplateParser.d.ts +26 -0
- package/{src → dist/esm/src}/utils/pathTemplateParser.js +21 -40
- package/dist/esm/src/utils/utils.d.ts +1 -0
- package/dist/esm/src/utils/utils.js +11 -0
- package/dist/esm/start.d.ts +1 -0
- package/dist/esm/start.js +7 -0
- package/index.ts +147 -0
- package/package.json +106 -74
- package/src/assetManager.ts +191 -0
- package/src/assets/routes.ts +132 -0
- package/src/clusterService.ts +134 -0
- package/src/codeGeneratorManager.ts +57 -0
- package/src/config/routes.ts +159 -0
- package/src/configManager.ts +148 -0
- package/src/containerManager.ts +466 -0
- package/src/filesystem/routes.ts +74 -0
- package/src/filesystemManager.ts +93 -0
- package/src/identities/routes.ts +20 -0
- package/src/instanceManager.ts +503 -0
- package/src/instances/routes.ts +164 -0
- package/src/middleware/cors.ts +9 -0
- package/src/middleware/kapeta.ts +27 -0
- package/src/middleware/stringBody.ts +16 -0
- package/src/networkManager.ts +137 -0
- package/src/operatorManager.ts +221 -0
- package/src/progressListener.ts +102 -0
- package/src/{providerManager.js → providerManager.ts} +15 -31
- package/src/providers/routes.ts +46 -0
- package/src/proxy/routes.ts +148 -0
- package/src/proxy/types/{rest.js → rest.ts} +30 -30
- package/src/proxy/types/web.ts +60 -0
- package/src/{repositoryManager.js → repositoryManager.ts} +45 -73
- package/src/serviceManager.ts +120 -0
- package/src/socketManager.ts +57 -0
- package/src/storageService.ts +88 -0
- package/src/traffic/routes.ts +18 -0
- package/src/types.ts +97 -0
- package/src/utils/BlockInstanceRunner.ts +555 -0
- package/src/utils/LogData.ts +47 -0
- package/src/utils/pathTemplateParser.ts +138 -0
- package/src/utils/utils.ts +12 -0
- package/start.ts +8 -0
- package/tsconfig.json +13 -0
- package/index.js +0 -127
- package/src/config/routes.js +0 -160
- package/src/filesystem/routes.js +0 -74
- package/src/identities/routes.js +0 -19
- package/src/progressListener.js +0 -82
- package/src/proxy/routes.js +0 -126
- package/src/utils/utils.js +0 -13
- 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
|
-
|
package/src/config/routes.js
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
const Router = require('express-promise-router').default;
|
2
|
-
const configManager = require('../configManager');
|
3
|
-
const serviceManager = require('../serviceManager');
|
4
|
-
const operatorManager = require('../operatorManager');
|
5
|
-
|
6
|
-
const router = new Router();
|
7
|
-
const SYSTEM_ID = '$plan';
|
8
|
-
|
9
|
-
router.use('/', require('../middleware/cors'));
|
10
|
-
router.use('/', require('../middleware/kapeta'));
|
11
|
-
router.use('/', require('../middleware/stringBody'));
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Returns the full configuration for a given service.
|
15
|
-
*/
|
16
|
-
router.get('/instance', (req, res) => {
|
17
|
-
|
18
|
-
const config = req.kapeta.instanceId ?
|
19
|
-
configManager.getConfigForSection(req.kapeta.systemId, req.kapeta.instanceId) :
|
20
|
-
configManager.getConfigForSystem(req.kapeta.systemId);
|
21
|
-
|
22
|
-
res.send(config);
|
23
|
-
});
|
24
|
-
|
25
|
-
/**
|
26
|
-
* Updates the full configuration for a given service.
|
27
|
-
*/
|
28
|
-
router.put('/instance', (req, res) => {
|
29
|
-
|
30
|
-
let config = JSON.parse(req.stringBody);
|
31
|
-
if (!config) {
|
32
|
-
config = {};
|
33
|
-
}
|
34
|
-
|
35
|
-
if (req.kapeta.instanceId) {
|
36
|
-
configManager.setConfigForSection(
|
37
|
-
req.kapeta.systemId,
|
38
|
-
req.kapeta.instanceId,
|
39
|
-
config
|
40
|
-
);
|
41
|
-
} else {
|
42
|
-
configManager.setConfigForSystem(
|
43
|
-
req.kapeta.systemId,
|
44
|
-
config
|
45
|
-
);
|
46
|
-
}
|
47
|
-
|
48
|
-
res.status(202).send({ok:true});
|
49
|
-
});
|
50
|
-
|
51
|
-
/**
|
52
|
-
* Returns the full configuration for a plan
|
53
|
-
*/
|
54
|
-
router.get('/system', (req, res) => {
|
55
|
-
const config = configManager.getConfigForSection(req.kapeta.systemId, SYSTEM_ID);
|
56
|
-
|
57
|
-
res.send(config);
|
58
|
-
});
|
59
|
-
|
60
|
-
/**
|
61
|
-
* Updates the full configuration for a plan
|
62
|
-
*/
|
63
|
-
router.put('/system', (req, res) => {
|
64
|
-
|
65
|
-
let config = JSON.parse(req.stringBody);
|
66
|
-
if (!config) {
|
67
|
-
config = {};
|
68
|
-
}
|
69
|
-
configManager.setConfigForSection(
|
70
|
-
req.kapeta.systemId,
|
71
|
-
SYSTEM_ID,
|
72
|
-
config
|
73
|
-
);
|
74
|
-
res.status(202).send({ok:true});
|
75
|
-
});
|
76
|
-
|
77
|
-
|
78
|
-
/**
|
79
|
-
* Resolves and checks the identity of a block instance
|
80
|
-
*/
|
81
|
-
router.get('/identity', async (req, res) => {
|
82
|
-
|
83
|
-
|
84
|
-
const identity = {
|
85
|
-
systemId: req.kapeta.systemId,
|
86
|
-
instanceId: req.kapeta.instanceId
|
87
|
-
};
|
88
|
-
|
89
|
-
if (!req.kapeta.blockRef) {
|
90
|
-
res.status(400).send({error: 'Missing required header "X-Kapeta-Block"'});
|
91
|
-
return;
|
92
|
-
}
|
93
|
-
|
94
|
-
try {
|
95
|
-
|
96
|
-
if (!identity.systemId ||
|
97
|
-
!identity.instanceId) {
|
98
|
-
const {systemId, instanceId} = await configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
|
99
|
-
identity.systemId = systemId;
|
100
|
-
identity.instanceId = instanceId;
|
101
|
-
} else {
|
102
|
-
await configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
|
103
|
-
}
|
104
|
-
|
105
|
-
res.send(identity);
|
106
|
-
} catch(err) {
|
107
|
-
console.warn('Failed to resolve identity', err);
|
108
|
-
res.status(400).send({error: err.message});
|
109
|
-
}
|
110
|
-
});
|
111
|
-
|
112
|
-
/**
|
113
|
-
* Services call this to request a free port. If a service has
|
114
|
-
* already called the endpoint the same port is returned.
|
115
|
-
*/
|
116
|
-
router.get('/provides/:type', async (req, res) => {
|
117
|
-
//Get service port
|
118
|
-
res.send('' + await serviceManager.ensureServicePort(
|
119
|
-
req.kapeta.systemId,
|
120
|
-
req.kapeta.instanceId,
|
121
|
-
req.params.type
|
122
|
-
));
|
123
|
-
});
|
124
|
-
|
125
|
-
/**
|
126
|
-
* Used by services to get info for consumed operator resource.
|
127
|
-
*
|
128
|
-
* If the operator resource is not already available this will cause it to start an instance and
|
129
|
-
* assign port numbers to it etc.
|
130
|
-
*/
|
131
|
-
router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res) => {
|
132
|
-
const operatorInfo = await operatorManager.getConsumerResourceInfo(
|
133
|
-
req.kapeta.systemId,
|
134
|
-
req.kapeta.instanceId,
|
135
|
-
req.params.resourceType,
|
136
|
-
req.params.portType,
|
137
|
-
req.params.name,
|
138
|
-
req.kapeta.environment
|
139
|
-
);
|
140
|
-
|
141
|
-
res.send(operatorInfo);
|
142
|
-
});
|
143
|
-
|
144
|
-
/**
|
145
|
-
* Used by services to get address for their clients.
|
146
|
-
*
|
147
|
-
* If the remote service is not already registered with a port - we do that here
|
148
|
-
* to handle clients for services that hasn't started yet.
|
149
|
-
*/
|
150
|
-
router.get('/consumes/:resourceName/:type', (req, res) => {
|
151
|
-
res.send(serviceManager.getConsumerAddress(
|
152
|
-
req.kapeta.systemId,
|
153
|
-
req.kapeta.instanceId,
|
154
|
-
req.params.resourceName,
|
155
|
-
req.params.type,
|
156
|
-
req.kapeta.environment,
|
157
|
-
));
|
158
|
-
});
|
159
|
-
|
160
|
-
module.exports = router;
|
package/src/filesystem/routes.js
DELETED
@@ -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;
|
package/src/identities/routes.js
DELETED
@@ -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;
|
package/src/progressListener.js
DELETED
@@ -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
|
-
}
|