@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.
- 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 +7 -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/{src → dist/esm/src}/config/routes.js +40 -89
- 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 +88 -179
- 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/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
package/.eslintrc.cjs
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module.exports = {
|
2
|
+
extends: ['@kapeta/eslint-config'],
|
3
|
+
env: {
|
4
|
+
node: true,
|
5
|
+
},
|
6
|
+
rules: {
|
7
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
8
|
+
'@typescript-eslint/no-non-null-assertion': 'off',
|
9
|
+
'@typescript-eslint/no-unsafe-assignment': 'off',
|
10
|
+
'@typescript-eslint/no-unsafe-member-access': 'off',
|
11
|
+
'@typescript-eslint/no-unsafe-return': 'off',
|
12
|
+
},
|
13
|
+
parserOptions: {
|
14
|
+
project: `${__dirname}/tsconfig.json`,
|
15
|
+
tsconfigRootDir: __dirname,
|
16
|
+
},
|
17
|
+
};
|
@@ -1,26 +1,26 @@
|
|
1
1
|
name: Main build
|
2
2
|
on:
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
pull_request:
|
4
|
+
push:
|
5
|
+
branches: ['master']
|
6
6
|
|
7
7
|
jobs:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
8
|
+
build:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v3
|
12
|
+
with:
|
13
|
+
token: ${{ secrets.BOT_TOKEN }}
|
14
|
+
- uses: actions/setup-node@v3
|
15
|
+
- run: npm ci
|
16
|
+
- run: npm run build --if-present
|
17
|
+
env:
|
18
|
+
CI: true
|
19
|
+
- run: npm test -- --passWithNoTests
|
20
|
+
# Probably move this to its own job when it makes sense
|
21
|
+
- name: Semantic Release
|
22
|
+
uses: cycjimmy/semantic-release-action@v3
|
23
|
+
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
|
24
|
+
env:
|
25
|
+
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
|
26
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/.prettierignore
ADDED
package/.vscode/launch.json
CHANGED
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [0.7.0](https://github.com/kapetacom/local-cluster-service/compare/v0.6.1...v0.7.0) (2023-07-16)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* Rewrote service to Typescript ([#40](https://github.com/kapetacom/local-cluster-service/issues/40)) ([e9ead38](https://github.com/kapetacom/local-cluster-service/commit/e9ead38422e648cd270e32e93d240fb9a807c723))
|
7
|
+
|
1
8
|
## [0.6.1](https://github.com/kapetacom/local-cluster-service/compare/v0.6.0...v0.6.1) (2023-06-21)
|
2
9
|
|
3
10
|
|
package/definitions.d.ts
CHANGED
@@ -1,42 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
declare module '@kapeta/nodejs-api-client' {
|
2
|
+
export class KapetaAPI {
|
3
|
+
getCurrentIdentity(): Promise<any>;
|
4
|
+
getMemberships(identityId: string): Promise<any>;
|
5
|
+
}
|
6
6
|
}
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
status: (status:number) => void
|
11
|
-
send: (body:any) => void
|
12
|
-
end: () => void
|
13
|
-
set: (headers:{[key:string]:string}) => void
|
14
|
-
}
|
8
|
+
declare module '@kapeta/nodejs-registry-utils' {
|
9
|
+
import { Dependency, Kind } from '@kapeta/schemas';
|
15
10
|
|
16
|
-
interface
|
17
|
-
|
18
|
-
|
19
|
-
}
|
11
|
+
export interface AssetVersion {
|
12
|
+
content: Kind;
|
13
|
+
dependencies: Dependency[];
|
14
|
+
}
|
20
15
|
|
21
|
-
|
16
|
+
export class RegistryService {
|
17
|
+
constructor(url: string);
|
22
18
|
|
19
|
+
async getVersion(fullName: string, version: string): Promise<AssetVersion>;
|
20
|
+
}
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
provider: ResourceRef
|
27
|
-
consumer: ResourceRef
|
22
|
+
export const Config: any;
|
23
|
+
export const Actions: any;
|
28
24
|
}
|
29
|
-
|
30
|
-
interface ResourceInfo {
|
31
|
-
spec:any
|
32
|
-
metadata:any
|
33
|
-
kind:string
|
34
|
-
}
|
35
|
-
|
36
|
-
interface ProxyRequestInfo {
|
37
|
-
address: string
|
38
|
-
connection:Connection
|
39
|
-
providerResource:ResourceInfo
|
40
|
-
consumerResource:ResourceInfo
|
41
|
-
consumerPath:string
|
42
|
-
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import HTTP from 'http';
|
3
|
+
export type LocalClusterService = HTTP.Server & {
|
4
|
+
host?: string;
|
5
|
+
port?: number;
|
6
|
+
};
|
7
|
+
export type StartResult = {
|
8
|
+
host: string;
|
9
|
+
port: number;
|
10
|
+
dockerStatus: boolean;
|
11
|
+
};
|
12
|
+
declare const _default: {
|
13
|
+
isRunning: () => boolean;
|
14
|
+
getCurrentPort: () => number | undefined;
|
15
|
+
/**
|
16
|
+
* Starts the local cluster service.
|
17
|
+
* resolves when listening is done with port number. Rejects if listening failed.
|
18
|
+
*/
|
19
|
+
start: () => Promise<StartResult>;
|
20
|
+
/**
|
21
|
+
* Stops any currently running cluster services.
|
22
|
+
* @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
|
23
|
+
*/
|
24
|
+
stop: () => Promise<unknown>;
|
25
|
+
getServices: () => any;
|
26
|
+
};
|
27
|
+
export default _default;
|
@@ -0,0 +1,126 @@
|
|
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
|
+
const clusterService_1 = require("./src/clusterService");
|
7
|
+
const storageService_1 = require("./src/storageService");
|
8
|
+
const serviceManager_1 = require("./src/serviceManager");
|
9
|
+
const socketManager_1 = require("./src/socketManager");
|
10
|
+
const containerManager_1 = require("./src/containerManager");
|
11
|
+
const express_1 = __importDefault(require("express"));
|
12
|
+
const http_1 = __importDefault(require("http"));
|
13
|
+
const socket_io_1 = require("socket.io");
|
14
|
+
const routes_1 = __importDefault(require("./src/traffic/routes"));
|
15
|
+
const routes_2 = __importDefault(require("./src/proxy/routes"));
|
16
|
+
const routes_3 = __importDefault(require("./src/config/routes"));
|
17
|
+
const routes_4 = __importDefault(require("./src/instances/routes"));
|
18
|
+
const routes_5 = __importDefault(require("./src/identities/routes"));
|
19
|
+
const routes_6 = __importDefault(require("./src/filesystem/routes"));
|
20
|
+
const routes_7 = __importDefault(require("./src/assets/routes"));
|
21
|
+
const routes_8 = __importDefault(require("./src/providers/routes"));
|
22
|
+
let currentServer = null;
|
23
|
+
function createServer() {
|
24
|
+
const app = (0, express_1.default)();
|
25
|
+
app.use('/traffic', routes_1.default);
|
26
|
+
app.use('/proxy', routes_2.default);
|
27
|
+
app.use('/config', routes_3.default);
|
28
|
+
app.use('/instances', routes_4.default);
|
29
|
+
app.use('/identities', routes_5.default);
|
30
|
+
app.use('/files', routes_6.default);
|
31
|
+
app.use('/assets', routes_7.default);
|
32
|
+
app.use('/providers', routes_8.default);
|
33
|
+
app.use('/', (err, req, res) => {
|
34
|
+
console.error('Request failed: %s %s', req.method, req.originalUrl, err);
|
35
|
+
res.status(500).send({
|
36
|
+
ok: false,
|
37
|
+
error: err.error ?? err.message,
|
38
|
+
});
|
39
|
+
});
|
40
|
+
const server = http_1.default.createServer(app);
|
41
|
+
//socket
|
42
|
+
const io = new socket_io_1.Server(server, {
|
43
|
+
cors: {
|
44
|
+
//TODO: This should'nt be hardcoded but also shouldn't be "*"
|
45
|
+
origin: 'http://localhost:8080',
|
46
|
+
},
|
47
|
+
});
|
48
|
+
socketManager_1.socketManager.setIo(io);
|
49
|
+
return server;
|
50
|
+
}
|
51
|
+
exports.default = {
|
52
|
+
isRunning: function () {
|
53
|
+
return !!currentServer;
|
54
|
+
},
|
55
|
+
getCurrentPort: function () {
|
56
|
+
if (!currentServer) {
|
57
|
+
return -1;
|
58
|
+
}
|
59
|
+
return currentServer.port;
|
60
|
+
},
|
61
|
+
/**
|
62
|
+
* Starts the local cluster service.
|
63
|
+
* resolves when listening is done with port number. Rejects if listening failed.
|
64
|
+
*/
|
65
|
+
start: async function () {
|
66
|
+
if (currentServer) {
|
67
|
+
throw new Error('Server already started');
|
68
|
+
}
|
69
|
+
try {
|
70
|
+
await containerManager_1.containerManager.initialize();
|
71
|
+
}
|
72
|
+
catch (e) {
|
73
|
+
console.error('Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.');
|
74
|
+
}
|
75
|
+
const clusterPort = storageService_1.storageService.get('cluster', 'port');
|
76
|
+
if (clusterPort) {
|
77
|
+
clusterService_1.clusterService.setClusterServicePort(clusterPort);
|
78
|
+
}
|
79
|
+
const clusterHost = storageService_1.storageService.get('cluster', 'host');
|
80
|
+
if (clusterHost) {
|
81
|
+
clusterService_1.clusterService.setClusterServiceHost(clusterHost);
|
82
|
+
}
|
83
|
+
await clusterService_1.clusterService.init();
|
84
|
+
currentServer = createServer();
|
85
|
+
const port = clusterService_1.clusterService.getClusterServicePort();
|
86
|
+
const host = clusterService_1.clusterService.getClusterServiceHost();
|
87
|
+
if (clusterPort !== port) {
|
88
|
+
storageService_1.storageService.put('cluster', 'port', port);
|
89
|
+
}
|
90
|
+
if (clusterHost !== host) {
|
91
|
+
storageService_1.storageService.put('cluster', 'host', host);
|
92
|
+
}
|
93
|
+
return new Promise((resolve, reject) => {
|
94
|
+
if (!currentServer) {
|
95
|
+
reject(new Error(`Current server wasn't set`));
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
currentServer.once('error', (err) => {
|
99
|
+
if (currentServer) {
|
100
|
+
currentServer.close();
|
101
|
+
currentServer = null;
|
102
|
+
}
|
103
|
+
reject(err);
|
104
|
+
});
|
105
|
+
currentServer.listen(port, host, () => resolve({ host, port, dockerStatus: containerManager_1.containerManager.isAlive() }));
|
106
|
+
currentServer.host = host;
|
107
|
+
currentServer.port = port;
|
108
|
+
});
|
109
|
+
},
|
110
|
+
/**
|
111
|
+
* Stops any currently running cluster services.
|
112
|
+
* @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
|
113
|
+
*/
|
114
|
+
stop: function () {
|
115
|
+
if (currentServer) {
|
116
|
+
return new Promise(function (resolve) {
|
117
|
+
if (currentServer) {
|
118
|
+
currentServer.close(() => resolve(true));
|
119
|
+
currentServer = null;
|
120
|
+
}
|
121
|
+
});
|
122
|
+
}
|
123
|
+
return Promise.resolve(false);
|
124
|
+
},
|
125
|
+
getServices: () => serviceManager_1.serviceManager.getServices(),
|
126
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"type":"commonjs"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { Definition } from '@kapeta/local-cluster-config';
|
2
|
+
import { BlockDefinition } from '@kapeta/schemas';
|
3
|
+
export interface EnrichedAsset {
|
4
|
+
ref: string;
|
5
|
+
editable: boolean;
|
6
|
+
exists: boolean;
|
7
|
+
version: string;
|
8
|
+
kind: string;
|
9
|
+
data: Definition;
|
10
|
+
path: string;
|
11
|
+
ymlPath: string;
|
12
|
+
}
|
13
|
+
declare class AssetManager {
|
14
|
+
private cache;
|
15
|
+
constructor();
|
16
|
+
/**
|
17
|
+
*
|
18
|
+
* @param {string[]} [assetKinds]
|
19
|
+
* @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
|
20
|
+
*/
|
21
|
+
getAssets(assetKinds?: string[]): EnrichedAsset[];
|
22
|
+
getPlans(): EnrichedAsset[];
|
23
|
+
getPlan(ref: string, noCache?: boolean): Promise<Definition>;
|
24
|
+
getAsset(ref: string, noCache?: boolean): Promise<EnrichedAsset | undefined>;
|
25
|
+
createAsset(path: string, yaml: BlockDefinition): Promise<EnrichedAsset[]>;
|
26
|
+
updateAsset(ref: string, yaml: BlockDefinition): Promise<void>;
|
27
|
+
importFile(filePath: string): Promise<EnrichedAsset[]>;
|
28
|
+
unregisterAsset(ref: string): Promise<void>;
|
29
|
+
}
|
30
|
+
export declare const assetManager: AssetManager;
|
31
|
+
export {};
|
@@ -0,0 +1,153 @@
|
|
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.assetManager = void 0;
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
10
|
+
const yaml_1 = __importDefault(require("yaml"));
|
11
|
+
const node_cache_1 = __importDefault(require("node-cache"));
|
12
|
+
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
13
|
+
const codeGeneratorManager_1 = require("./codeGeneratorManager");
|
14
|
+
const progressListener_1 = require("./progressListener");
|
15
|
+
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
16
|
+
const repositoryManager_1 = require("./repositoryManager");
|
17
|
+
const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
|
18
|
+
function enrichAsset(asset) {
|
19
|
+
return {
|
20
|
+
ref: `kapeta://${asset.definition.metadata.name}:${asset.version}`,
|
21
|
+
editable: asset.version === 'local',
|
22
|
+
exists: true,
|
23
|
+
version: asset.version,
|
24
|
+
kind: asset.definition.kind,
|
25
|
+
data: asset.definition,
|
26
|
+
path: asset.path,
|
27
|
+
ymlPath: asset.ymlPath,
|
28
|
+
};
|
29
|
+
}
|
30
|
+
function compareRefs(a, b) {
|
31
|
+
const [aProtocol, aId] = parseRef(a);
|
32
|
+
const [bProtocol, bId] = parseRef(b);
|
33
|
+
return aProtocol === bProtocol && aId === bId;
|
34
|
+
}
|
35
|
+
function parseRef(ref) {
|
36
|
+
let out = ref.split(/:\/\//, 2);
|
37
|
+
if (out.length === 1) {
|
38
|
+
return ['kapeta', ref.toLowerCase()];
|
39
|
+
}
|
40
|
+
return [out[0].toLowerCase(), out[1].toLowerCase()];
|
41
|
+
}
|
42
|
+
class AssetManager {
|
43
|
+
cache;
|
44
|
+
constructor() {
|
45
|
+
this.cache = new node_cache_1.default({
|
46
|
+
stdTTL: 60 * 60, // 1 hour
|
47
|
+
});
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
*
|
51
|
+
* @param {string[]} [assetKinds]
|
52
|
+
* @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
|
53
|
+
*/
|
54
|
+
getAssets(assetKinds) {
|
55
|
+
if (!assetKinds) {
|
56
|
+
const blockTypeProviders = local_cluster_config_1.default.getDefinitions([
|
57
|
+
'core/block-type',
|
58
|
+
'core/block-type-operator',
|
59
|
+
]);
|
60
|
+
assetKinds = blockTypeProviders.map((p) => {
|
61
|
+
return `${p.definition.metadata.name}:${p.version}`;
|
62
|
+
});
|
63
|
+
assetKinds.push('core/plan');
|
64
|
+
}
|
65
|
+
const assets = local_cluster_config_1.default.getDefinitions(assetKinds);
|
66
|
+
return assets.map(enrichAsset);
|
67
|
+
}
|
68
|
+
getPlans() {
|
69
|
+
return this.getAssets(['core/plan']);
|
70
|
+
}
|
71
|
+
async getPlan(ref, noCache = false) {
|
72
|
+
const asset = await this.getAsset(ref, noCache);
|
73
|
+
if ('core/plan' !== asset?.kind) {
|
74
|
+
throw new Error('Asset was not a plan: ' + ref);
|
75
|
+
}
|
76
|
+
return asset.data;
|
77
|
+
}
|
78
|
+
async getAsset(ref, noCache = false) {
|
79
|
+
const cacheKey = `getAsset:${ref}`;
|
80
|
+
if (!noCache && this.cache.has(cacheKey)) {
|
81
|
+
return this.cache.get(cacheKey);
|
82
|
+
}
|
83
|
+
const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
|
84
|
+
await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version);
|
85
|
+
let asset = local_cluster_config_1.default.getDefinitions()
|
86
|
+
.map(enrichAsset)
|
87
|
+
.find((a) => (0, nodejs_utils_1.parseKapetaUri)(a.ref).equals(uri));
|
88
|
+
if (!asset) {
|
89
|
+
throw new Error('Asset not found: ' + ref);
|
90
|
+
}
|
91
|
+
this.cache.set(cacheKey, asset);
|
92
|
+
return asset;
|
93
|
+
}
|
94
|
+
async createAsset(path, yaml) {
|
95
|
+
if (node_fs_1.default.existsSync(path)) {
|
96
|
+
throw new Error('File already exists: ' + path);
|
97
|
+
}
|
98
|
+
const dirName = node_path_1.default.dirname(path);
|
99
|
+
if (!node_fs_1.default.existsSync(dirName)) {
|
100
|
+
fs_extra_1.default.mkdirpSync(dirName);
|
101
|
+
}
|
102
|
+
node_fs_1.default.writeFileSync(path, yaml_1.default.stringify(yaml));
|
103
|
+
const asset = await this.importFile(path);
|
104
|
+
if (codeGeneratorManager_1.codeGeneratorManager.canGenerateCode(yaml)) {
|
105
|
+
await codeGeneratorManager_1.codeGeneratorManager.generate(path, yaml);
|
106
|
+
}
|
107
|
+
this.cache.flushAll();
|
108
|
+
return asset;
|
109
|
+
}
|
110
|
+
async updateAsset(ref, yaml) {
|
111
|
+
const asset = await this.getAsset(ref, true);
|
112
|
+
if (!asset) {
|
113
|
+
throw new Error('Attempted to update unknown asset: ' + ref);
|
114
|
+
}
|
115
|
+
if (!asset.editable) {
|
116
|
+
throw new Error('Attempted to update read-only asset: ' + ref);
|
117
|
+
}
|
118
|
+
if (!asset.ymlPath) {
|
119
|
+
throw new Error('Attempted to update corrupted asset: ' + ref);
|
120
|
+
}
|
121
|
+
node_fs_1.default.writeFileSync(asset.ymlPath, yaml_1.default.stringify(yaml));
|
122
|
+
this.cache.flushAll();
|
123
|
+
if (codeGeneratorManager_1.codeGeneratorManager.canGenerateCode(yaml)) {
|
124
|
+
await codeGeneratorManager_1.codeGeneratorManager.generate(asset.ymlPath, yaml);
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
console.log('Could not generate code for %s', yaml.kind ? yaml.kind : 'unknown yaml');
|
128
|
+
}
|
129
|
+
}
|
130
|
+
async importFile(filePath) {
|
131
|
+
if (filePath.startsWith('file://')) {
|
132
|
+
filePath = filePath.substring('file://'.length);
|
133
|
+
}
|
134
|
+
if (!node_fs_1.default.existsSync(filePath)) {
|
135
|
+
throw new Error('File not found: ' + filePath);
|
136
|
+
}
|
137
|
+
const assetInfos = yaml_1.default.parseAllDocuments(node_fs_1.default.readFileSync(filePath).toString()).map((doc) => doc.toJSON());
|
138
|
+
await nodejs_registry_utils_1.Actions.link(progressListener_1.progressListener, node_path_1.default.dirname(filePath));
|
139
|
+
const version = 'local';
|
140
|
+
const refs = assetInfos.map((assetInfo) => `kapeta://${assetInfo.metadata.name}:${version}`);
|
141
|
+
this.cache.flushAll();
|
142
|
+
return this.getAssets().filter((a) => refs.some((ref) => compareRefs(ref, a.ref)));
|
143
|
+
}
|
144
|
+
async unregisterAsset(ref) {
|
145
|
+
const asset = await this.getAsset(ref, true);
|
146
|
+
if (!asset) {
|
147
|
+
throw new Error('Asset does not exists: ' + ref);
|
148
|
+
}
|
149
|
+
this.cache.flushAll();
|
150
|
+
await nodejs_registry_utils_1.Actions.uninstall(progressListener_1.progressListener, [asset.ref]);
|
151
|
+
}
|
152
|
+
}
|
153
|
+
exports.assetManager = new AssetManager();
|
@@ -0,0 +1,117 @@
|
|
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
|
+
const express_promise_router_1 = __importDefault(require("express-promise-router"));
|
7
|
+
const yaml_1 = __importDefault(require("yaml"));
|
8
|
+
const assetManager_1 = require("../assetManager");
|
9
|
+
const cors_1 = require("../middleware/cors");
|
10
|
+
const stringBody_1 = require("../middleware/stringBody");
|
11
|
+
function parseBody(req) {
|
12
|
+
switch (req.headers['content-type']) {
|
13
|
+
case 'application/json':
|
14
|
+
case 'application/x-json':
|
15
|
+
case 'text/json':
|
16
|
+
return JSON.parse(req.stringBody ?? '{}');
|
17
|
+
case 'application/yaml':
|
18
|
+
case 'application/x-yaml':
|
19
|
+
case 'text/yaml':
|
20
|
+
case 'text/x-yaml':
|
21
|
+
default:
|
22
|
+
return yaml_1.default.parse(req.stringBody ?? '{}');
|
23
|
+
}
|
24
|
+
}
|
25
|
+
const router = (0, express_promise_router_1.default)();
|
26
|
+
router.use('/', cors_1.corsHandler);
|
27
|
+
router.use('/', stringBody_1.stringBody);
|
28
|
+
/**
|
29
|
+
* Get all local assets available
|
30
|
+
*/
|
31
|
+
router.get('/', (req, res) => {
|
32
|
+
res.send(assetManager_1.assetManager.getAssets());
|
33
|
+
});
|
34
|
+
/**
|
35
|
+
* Get single asset
|
36
|
+
*/
|
37
|
+
router.get('/read', async (req, res) => {
|
38
|
+
if (!req.query.ref) {
|
39
|
+
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
40
|
+
return;
|
41
|
+
}
|
42
|
+
try {
|
43
|
+
res.send(await assetManager_1.assetManager.getAsset(req.query.ref, true));
|
44
|
+
}
|
45
|
+
catch (err) {
|
46
|
+
res.status(400).send({ error: err.message });
|
47
|
+
}
|
48
|
+
});
|
49
|
+
/**
|
50
|
+
* Creates a new local file and registers it as an asset
|
51
|
+
*/
|
52
|
+
router.post('/create', async (req, res) => {
|
53
|
+
if (!req.query.path) {
|
54
|
+
res.status(400).send({ error: 'Query parameter "path" is missing' });
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
const content = parseBody(req);
|
58
|
+
try {
|
59
|
+
const assets = await assetManager_1.assetManager.createAsset(req.query.path, content);
|
60
|
+
res.status(200).send(assets);
|
61
|
+
}
|
62
|
+
catch (err) {
|
63
|
+
console.log('Failed while creating asset', req.query.path, err.message);
|
64
|
+
res.status(400).send({ error: err.message });
|
65
|
+
}
|
66
|
+
});
|
67
|
+
/**
|
68
|
+
* Updates reference with new content
|
69
|
+
*/
|
70
|
+
router.put('/update', async (req, res) => {
|
71
|
+
if (!req.query.ref) {
|
72
|
+
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
const content = parseBody(req);
|
76
|
+
try {
|
77
|
+
await assetManager_1.assetManager.updateAsset(req.query.ref, content);
|
78
|
+
res.sendStatus(204);
|
79
|
+
}
|
80
|
+
catch (err) {
|
81
|
+
console.log('Failed while updating asset', req.query.ref, err.message);
|
82
|
+
res.status(400).send({ error: err.message });
|
83
|
+
}
|
84
|
+
});
|
85
|
+
/**
|
86
|
+
* Unregisters an asset (doesn't delete the asset)
|
87
|
+
*/
|
88
|
+
router.delete('/', async (req, res) => {
|
89
|
+
if (!req.query.ref) {
|
90
|
+
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
91
|
+
return;
|
92
|
+
}
|
93
|
+
try {
|
94
|
+
await assetManager_1.assetManager.unregisterAsset(req.query.ref);
|
95
|
+
res.status(204).send();
|
96
|
+
}
|
97
|
+
catch (err) {
|
98
|
+
res.status(400).send({ error: err.message });
|
99
|
+
}
|
100
|
+
});
|
101
|
+
/**
|
102
|
+
* Registers an existing file as an asset
|
103
|
+
*/
|
104
|
+
router.put('/import', async (req, res) => {
|
105
|
+
if (!req.query.ref) {
|
106
|
+
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
try {
|
110
|
+
const assets = await assetManager_1.assetManager.importFile(req.query.ref);
|
111
|
+
res.status(200).send(assets);
|
112
|
+
}
|
113
|
+
catch (err) {
|
114
|
+
res.status(400).send({ error: err.message });
|
115
|
+
}
|
116
|
+
});
|
117
|
+
exports.default = router;
|
@@ -0,0 +1,40 @@
|
|
1
|
+
declare class ClusterService {
|
2
|
+
private _port;
|
3
|
+
private _currentPort;
|
4
|
+
private _initialized;
|
5
|
+
private _reservedPorts;
|
6
|
+
private _host;
|
7
|
+
constructor();
|
8
|
+
reservePort(port: number | string): void;
|
9
|
+
init(): Promise<void>;
|
10
|
+
_findClusterServicePort(): Promise<void>;
|
11
|
+
/**
|
12
|
+
* Gets next available port
|
13
|
+
* @return {Promise<number>}
|
14
|
+
*/
|
15
|
+
getNextAvailablePort(): Promise<number>;
|
16
|
+
_checkIfPortIsUsed(port: number, host?: string): Promise<unknown>;
|
17
|
+
/**
|
18
|
+
* The port of this local cluster service itself
|
19
|
+
*/
|
20
|
+
getClusterServicePort(): number;
|
21
|
+
getClusterServiceHost(): string;
|
22
|
+
/**
|
23
|
+
* Set the port to be used for this local service
|
24
|
+
* @param port
|
25
|
+
*/
|
26
|
+
setClusterServicePort(port: number): void;
|
27
|
+
setClusterServiceHost(host: string): void;
|
28
|
+
/**
|
29
|
+
* Gets that proxy path of a given request
|
30
|
+
*
|
31
|
+
* @param systemId
|
32
|
+
* @param consumerInstanceId
|
33
|
+
* @param consumerResourceName
|
34
|
+
* @param portType
|
35
|
+
* @return {string}
|
36
|
+
*/
|
37
|
+
getProxyPath(systemId: string, consumerInstanceId: string, consumerResourceName: string, portType: string): string;
|
38
|
+
}
|
39
|
+
export declare const clusterService: ClusterService;
|
40
|
+
export {};
|