@kapeta/local-cluster-service 0.6.1 → 0.7.1

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 +14 -0
  6. package/definitions.d.ts +17 -35
  7. package/dist/cjs/index.d.ts +27 -0
  8. package/dist/cjs/index.js +126 -0
  9. package/dist/cjs/package.json +1 -0
  10. package/dist/cjs/src/assetManager.d.ts +31 -0
  11. package/dist/cjs/src/assetManager.js +153 -0
  12. package/dist/cjs/src/assets/routes.d.ts +3 -0
  13. package/dist/cjs/src/assets/routes.js +117 -0
  14. package/dist/cjs/src/clusterService.d.ts +40 -0
  15. package/dist/cjs/src/clusterService.js +114 -0
  16. package/dist/cjs/src/codeGeneratorManager.d.ts +8 -0
  17. package/dist/cjs/src/codeGeneratorManager.js +53 -0
  18. package/dist/cjs/src/config/routes.d.ts +3 -0
  19. package/dist/cjs/src/config/routes.js +126 -0
  20. package/dist/cjs/src/configManager.d.ts +36 -0
  21. package/dist/cjs/src/configManager.js +110 -0
  22. package/dist/cjs/src/containerManager.d.ts +89 -0
  23. package/dist/cjs/src/containerManager.js +365 -0
  24. package/dist/cjs/src/filesystem/routes.d.ts +3 -0
  25. package/dist/cjs/src/filesystem/routes.js +69 -0
  26. package/dist/cjs/src/filesystemManager.d.ts +15 -0
  27. package/dist/cjs/src/filesystemManager.js +87 -0
  28. package/dist/cjs/src/identities/routes.d.ts +3 -0
  29. package/dist/cjs/src/identities/routes.js +18 -0
  30. package/dist/cjs/src/instanceManager.d.ts +56 -0
  31. package/dist/cjs/src/instanceManager.js +424 -0
  32. package/dist/cjs/src/instances/routes.d.ts +3 -0
  33. package/dist/cjs/src/instances/routes.js +134 -0
  34. package/dist/cjs/src/middleware/cors.d.ts +2 -0
  35. package/dist/cjs/src/middleware/cors.js +10 -0
  36. package/dist/cjs/src/middleware/kapeta.d.ts +11 -0
  37. package/dist/cjs/src/middleware/kapeta.js +17 -0
  38. package/dist/cjs/src/middleware/stringBody.d.ts +5 -0
  39. package/dist/cjs/src/middleware/stringBody.js +14 -0
  40. package/dist/cjs/src/networkManager.d.ts +32 -0
  41. package/dist/cjs/src/networkManager.js +109 -0
  42. package/dist/cjs/src/operatorManager.d.ts +36 -0
  43. package/dist/cjs/src/operatorManager.js +165 -0
  44. package/dist/cjs/src/progressListener.d.ts +20 -0
  45. package/dist/cjs/src/progressListener.js +91 -0
  46. package/dist/cjs/src/providerManager.d.ts +9 -0
  47. package/dist/cjs/src/providerManager.js +51 -0
  48. package/dist/cjs/src/providers/routes.d.ts +3 -0
  49. package/dist/cjs/src/providers/routes.js +42 -0
  50. package/dist/cjs/src/proxy/routes.d.ts +3 -0
  51. package/dist/cjs/src/proxy/routes.js +111 -0
  52. package/dist/cjs/src/proxy/types/rest.d.ts +4 -0
  53. package/dist/cjs/src/proxy/types/rest.js +114 -0
  54. package/dist/cjs/src/proxy/types/web.d.ts +4 -0
  55. package/dist/cjs/src/proxy/types/web.js +53 -0
  56. package/dist/cjs/src/repositoryManager.d.ts +17 -0
  57. package/dist/cjs/src/repositoryManager.js +218 -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 +212 -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} +49 -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
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
- pull_request:
4
- push:
5
- branches: ['master']
3
+ pull_request:
4
+ push:
5
+ branches: ['master']
6
6
 
7
7
  jobs:
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 }}
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 }}
@@ -0,0 +1,4 @@
1
+ dist/*
2
+ package-lock.json
3
+ CHANGELOG.md
4
+ README.md
@@ -8,10 +8,8 @@
8
8
  "type": "node",
9
9
  "request": "launch",
10
10
  "name": "Launch Program",
11
- "skipFiles": [
12
- "<node_internals>/**"
13
- ],
11
+ "skipFiles": ["<node_internals>/**"],
14
12
  "program": "${workspaceFolder}/start.js"
15
13
  }
16
14
  ]
17
- }
15
+ }
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.7.1](https://github.com/kapetacom/local-cluster-service/compare/v0.7.0...v0.7.1) (2023-07-16)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Do null check - filename sometimes is blank on win ([#41](https://github.com/kapetacom/local-cluster-service/issues/41)) ([5b4929f](https://github.com/kapetacom/local-cluster-service/commit/5b4929fb1fd6c209246fd7b5be6788eb0c1ae0c0))
7
+
8
+ # [0.7.0](https://github.com/kapetacom/local-cluster-service/compare/v0.6.1...v0.7.0) (2023-07-16)
9
+
10
+
11
+ ### Features
12
+
13
+ * Rewrote service to Typescript ([#40](https://github.com/kapetacom/local-cluster-service/issues/40)) ([e9ead38](https://github.com/kapetacom/local-cluster-service/commit/e9ead38422e648cd270e32e93d240fb9a807c723))
14
+
1
15
  ## [0.6.1](https://github.com/kapetacom/local-cluster-service/compare/v0.6.0...v0.6.1) (2023-06-21)
2
16
 
3
17
 
package/definitions.d.ts CHANGED
@@ -1,42 +1,24 @@
1
- interface Request {
2
- method: string
3
- stringBody: string
4
- headers: {[key:string]:string}
5
- params: {[key:string]:string}
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
- interface Response {
9
- headers: {[key:string]:string}
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 ResourceRef {
17
- blockId:string
18
- resourceName:string
19
- }
11
+ export interface AssetVersion {
12
+ content: Kind;
13
+ dependencies: Dependency[];
14
+ }
20
15
 
21
- declare function ProxyRequestHandler(req:Request, res:Response, info:ProxyRequestInfo);
16
+ export class RegistryService {
17
+ constructor(url: string);
22
18
 
19
+ async getVersion(fullName: string, version: string): Promise<AssetVersion>;
20
+ }
23
21
 
24
- interface Connection {
25
- mapping: any
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,3 @@
1
+ /// <reference types="express" />
2
+ declare const router: import("express").Router;
3
+ export default router;
@@ -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 {};