@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
@@ -0,0 +1,120 @@
1
+ import _ from 'lodash';
2
+ import { clusterService } from './clusterService';
3
+ import { storageService } from './storageService';
4
+ import { EnvironmentType } from './types';
5
+
6
+ const DEFAULT_PORT_TYPE = 'rest';
7
+
8
+ class ServiceManager {
9
+ private _systems: any;
10
+
11
+ constructor() {
12
+ this._systems = storageService.get('services');
13
+ if (!this._systems) {
14
+ this._systems = {};
15
+ }
16
+
17
+ _.forEach(this._systems, (system) => {
18
+ _.forEach(system, (services) => {
19
+ _.forEach(services, (portInfo) => {
20
+ clusterService.reservePort(portInfo.port);
21
+ });
22
+ });
23
+ });
24
+ }
25
+
26
+ _forLocal(port: string | number, path?: string, environmentType?: EnvironmentType) {
27
+ if (!path) {
28
+ path = '';
29
+ }
30
+ let host;
31
+ if (environmentType === 'docker') {
32
+ //We're inside a docker container, so we can use this special host name to access the host machine
33
+ host = 'host.docker.internal';
34
+ } else {
35
+ host = clusterService.getClusterServiceHost();
36
+ }
37
+
38
+ if (path.startsWith('/')) {
39
+ path = path.substring(1);
40
+ }
41
+ return `http://${host}:${port}/${path}`;
42
+ }
43
+
44
+ _ensureSystem(systemId: string) {
45
+ if (!this._systems[systemId]) {
46
+ this._systems[systemId] = {};
47
+ }
48
+
49
+ return this._systems[systemId];
50
+ }
51
+
52
+ _ensureService(systemId: string, serviceId: string) {
53
+ const system = this._ensureSystem(systemId);
54
+
55
+ if (!system[serviceId]) {
56
+ system[serviceId] = {};
57
+ }
58
+
59
+ return system[serviceId];
60
+ }
61
+
62
+ async ensureServicePort(systemId: string, blockInstanceId: string, portType: string = DEFAULT_PORT_TYPE) {
63
+ if (!portType) {
64
+ portType = DEFAULT_PORT_TYPE;
65
+ }
66
+
67
+ const service = this._ensureService(systemId, blockInstanceId);
68
+
69
+ if (!service[portType]) {
70
+ const port = await clusterService.getNextAvailablePort();
71
+ service[portType] = { port };
72
+ this._save();
73
+ }
74
+
75
+ const portTypeSection = service[portType];
76
+
77
+ return portTypeSection.port;
78
+ }
79
+
80
+ _save() {
81
+ storageService.put('services', this._systems);
82
+ }
83
+
84
+ /**
85
+ * Gets the consumable address of a service block resource
86
+ *
87
+ * This returns a local proxy path to allow traffic inspection and control.
88
+ *
89
+ */
90
+ getConsumerAddress(
91
+ systemId: string,
92
+ consumerInstanceId: string,
93
+ consumerResourceName: string,
94
+ portType: string,
95
+ environmentType?: EnvironmentType
96
+ ): string {
97
+ const port = clusterService.getClusterServicePort();
98
+ const path = clusterService.getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType);
99
+ return this._forLocal(port, path, environmentType);
100
+ }
101
+
102
+ /**
103
+ * Gets the direct address of a service block
104
+ *
105
+ * This returns the actual endpoint address of a service that we're talking to.
106
+ * For local services this address will be on localhost - for remote services it will
107
+ * be their remotely available address.
108
+ *
109
+ */
110
+ async getProviderAddress(systemId: string, providerInstanceId: string, portType: string): Promise<string> {
111
+ const port = await this.ensureServicePort(systemId, providerInstanceId, portType);
112
+ return this._forLocal(port);
113
+ }
114
+
115
+ getServices() {
116
+ return this._systems;
117
+ }
118
+ }
119
+
120
+ export const serviceManager = new ServiceManager();
@@ -0,0 +1,57 @@
1
+ import _ from 'lodash';
2
+ import { Socket, Server } from 'socket.io';
3
+
4
+ export class SocketManager {
5
+ private _io: Server | null;
6
+ private _sockets: Socket[];
7
+
8
+ constructor() {
9
+ this._io = null;
10
+ this._sockets = [];
11
+ return this;
12
+ }
13
+
14
+ setIo(io: Server) {
15
+ console.log('Socket server ready');
16
+ this._io = io;
17
+
18
+ this._bindIO();
19
+ }
20
+
21
+ private get io() {
22
+ if (!this._io) {
23
+ throw new Error('Socket server not ready');
24
+ }
25
+ return this._io;
26
+ }
27
+
28
+ emit(context: string, type: string, payload: any) {
29
+ this.io.to(context).emit(type, { context, payload });
30
+ }
31
+
32
+ _bindIO() {
33
+ this.io.on('connection', (socket) => this._handleSocketCreated(socket));
34
+ }
35
+
36
+ _handleSocketCreated(socket: Socket) {
37
+ this._bindSocket(socket);
38
+ this._sockets.push(socket);
39
+ }
40
+
41
+ _bindSocket(socket: Socket) {
42
+ socket.on('disconnect', () => this._handleSocketDestroyed(socket));
43
+ socket.on('join', (id) => {
44
+ console.log('socket joined ', id);
45
+ socket.join(id);
46
+ });
47
+ socket.on('leave', (id) => {
48
+ console.log('socket left ', id);
49
+ socket.leave(id);
50
+ });
51
+ }
52
+
53
+ _handleSocketDestroyed(socket: Socket) {
54
+ _.pull(this._sockets, socket);
55
+ }
56
+ }
57
+ export const socketManager = new SocketManager();
@@ -0,0 +1,88 @@
1
+ import _ from 'lodash';
2
+ import FS from 'fs';
3
+ import FSExtra from 'fs-extra';
4
+ import YAML from 'yaml';
5
+ import ClusterConfiguration from '@kapeta/local-cluster-config';
6
+
7
+ /**
8
+ * Class that handles reading and writing from local configuration file.
9
+ */
10
+ class StorageService {
11
+ private _data: { [key: string]: any };
12
+
13
+ constructor() {
14
+ this._data = this._readConfig();
15
+ }
16
+
17
+ getKapetaBasedir() {
18
+ return ClusterConfiguration.getKapetaBasedir();
19
+ }
20
+
21
+ _readConfig() {
22
+ return ClusterConfiguration.getClusterConfig();
23
+ }
24
+
25
+ _writeConfig() {
26
+ const configFile = ClusterConfiguration.getClusterConfigFile();
27
+
28
+ FSExtra.mkdirsSync(this.getKapetaBasedir());
29
+
30
+ FS.writeFileSync(configFile, YAML.stringify(this._data));
31
+ }
32
+
33
+ section<T = any>(section: string, defaultValue?: any): T {
34
+ if (!defaultValue) {
35
+ defaultValue = {};
36
+ }
37
+ if (!this._data[section]) {
38
+ this._data[section] = defaultValue;
39
+ this._writeConfig();
40
+ }
41
+
42
+ return this._data[section];
43
+ }
44
+
45
+ put(section: string, property: string | any, value?: any) {
46
+ if (!_.isString(property)) {
47
+ this._data[section] = property;
48
+ this._writeConfig();
49
+ return;
50
+ }
51
+
52
+ this.section(section)[property] = value;
53
+ this._writeConfig();
54
+ }
55
+
56
+ get(section: string, property?: string): any {
57
+ if (!property) {
58
+ return this.section(section);
59
+ }
60
+
61
+ return this.section(section)[property];
62
+ }
63
+
64
+ contains(section: string, property: string) {
65
+ if (!this._data[section]) {
66
+ return false;
67
+ }
68
+
69
+ return this._data[section].hasOwnProperty(property);
70
+ }
71
+
72
+ ensure(section: string, property: string, value: any) {
73
+ if (this.contains(section, property)) {
74
+ return this.get(section, property);
75
+ }
76
+
77
+ let out = value;
78
+ if (typeof value === 'function') {
79
+ out = value();
80
+ }
81
+
82
+ this.put(section, property, out);
83
+
84
+ return out;
85
+ }
86
+ }
87
+
88
+ export const storageService = new StorageService();
@@ -0,0 +1,18 @@
1
+ import Router from 'express-promise-router';
2
+ import { Request, Response } from 'express';
3
+ import { networkManager } from '../networkManager';
4
+
5
+ const router = Router();
6
+ router.get('/:systemId/target/:connectionId/', (req: Request, res: Response) => {
7
+ res.send(networkManager.getTrafficForConnection(req.params.systemId, req.params.connectionId));
8
+ });
9
+
10
+ router.get('/:systemId/source/:blockInstanceId/', (req: Request, res: Response) => {
11
+ res.send(networkManager.getTrafficForSource(req.params.systemId, req.params.blockInstanceId));
12
+ });
13
+
14
+ router.get('/:systemId/target/:blockInstanceId/', (req: Request, res: Response) => {
15
+ res.send(networkManager.getTrafficForTarget(req.params.systemId, req.params.blockInstanceId));
16
+ });
17
+
18
+ export default router;
package/src/types.ts ADDED
@@ -0,0 +1,97 @@
1
+ import EventEmitter from 'events';
2
+ import express from 'express';
3
+ import { Resource } from '@kapeta/schemas';
4
+ import { StringBodyRequest } from './middleware/stringBody';
5
+ import { KapetaRequest } from './middleware/kapeta';
6
+
7
+ export type StringMap = { [key: string]: string };
8
+ export type AnyMap = { [key: string]: any };
9
+
10
+ export type LogLevel = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'FATAL';
11
+ export type LogSource = 'stdout' | 'stderr';
12
+ export type EnvironmentType = 'docker' | 'process';
13
+ export interface LogEntry {
14
+ source: LogSource;
15
+ level: LogLevel;
16
+ message: string;
17
+ time: number;
18
+ }
19
+
20
+ export interface BlockProcessParams {
21
+ id: string;
22
+ ref: string;
23
+ configuration?: AnyMap;
24
+ }
25
+
26
+ export type ProcessType = 'docker' | 'local';
27
+
28
+ export interface ProcessDetails {
29
+ pid: number | string;
30
+ type: ProcessType;
31
+ portType?: string;
32
+ output: EventEmitter;
33
+ logs: () => LogEntry[];
34
+ stop: () => Promise<void> | void;
35
+ }
36
+
37
+ export interface ProcessInfo extends ProcessDetails {
38
+ id: string;
39
+ ref: string;
40
+ name: string;
41
+ }
42
+
43
+ export type InstanceInfo = {
44
+ systemId: string;
45
+ instanceId: string;
46
+ address?: string;
47
+ health?: string | null;
48
+ status: string;
49
+ pid?: number | string | null;
50
+ type: ProcessType;
51
+ portType?: string;
52
+ };
53
+
54
+ interface ResourceRef {
55
+ blockId: string;
56
+ resourceName: string;
57
+ }
58
+
59
+ export type ProxyRequestHandler = (req: StringBodyRequest, res: express.Response, info: ProxyRequestInfo) => void;
60
+
61
+ export interface Connection {
62
+ mapping: any;
63
+ provider: ResourceRef;
64
+ consumer: ResourceRef;
65
+ }
66
+
67
+ export interface OperatorInfo {
68
+ host: string;
69
+ port: string;
70
+ type: string;
71
+ protocol: string;
72
+ options: AnyMap;
73
+ credentials: AnyMap;
74
+ }
75
+
76
+ export interface ProxyRequestInfo {
77
+ address: string;
78
+ connection: Connection;
79
+ providerResource: Resource;
80
+ consumerResource: Resource;
81
+ consumerPath: string;
82
+ }
83
+
84
+ export interface SimpleResponse {
85
+ code: number;
86
+ headers: StringMap;
87
+ body: any;
88
+ }
89
+
90
+ export interface SimpleRequest {
91
+ method: string;
92
+ url: string;
93
+ headers: StringMap;
94
+ body: any;
95
+ }
96
+
97
+ export type KapetaBodyRequest = KapetaRequest & StringBodyRequest;