@kapeta/local-cluster-service 0.16.7 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index.js +2 -0
  3. package/dist/cjs/src/instanceManager.js +30 -0
  4. package/dist/cjs/src/socketManager.js +6 -0
  5. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
  6. package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
  7. package/dist/esm/index.js +64 -57
  8. package/dist/esm/src/RepositoryWatcher.js +40 -33
  9. package/dist/esm/src/api.js +14 -9
  10. package/dist/esm/src/assetManager.js +62 -56
  11. package/dist/esm/src/assets/routes.js +22 -17
  12. package/dist/esm/src/attachments/routes.js +14 -9
  13. package/dist/esm/src/cacheManager.js +13 -5
  14. package/dist/esm/src/clusterService.js +6 -3
  15. package/dist/esm/src/codeGeneratorManager.js +19 -13
  16. package/dist/esm/src/config/routes.js +30 -25
  17. package/dist/esm/src/configManager.js +29 -26
  18. package/dist/esm/src/containerManager.js +48 -39
  19. package/dist/esm/src/definitionsManager.js +15 -9
  20. package/dist/esm/src/filesystem/routes.js +21 -16
  21. package/dist/esm/src/filesystemManager.js +23 -17
  22. package/dist/esm/src/identities/routes.js +13 -8
  23. package/dist/esm/src/instanceManager.js +186 -149
  24. package/dist/esm/src/instances/routes.js +38 -33
  25. package/dist/esm/src/middleware/cors.js +5 -1
  26. package/dist/esm/src/middleware/kapeta.js +8 -4
  27. package/dist/esm/src/middleware/stringBody.js +5 -1
  28. package/dist/esm/src/networkManager.js +15 -9
  29. package/dist/esm/src/operatorManager.js +45 -39
  30. package/dist/esm/src/progressListener.js +16 -12
  31. package/dist/esm/src/providerManager.js +22 -16
  32. package/dist/esm/src/providers/routes.js +14 -9
  33. package/dist/esm/src/proxy/routes.js +26 -21
  34. package/dist/esm/src/proxy/types/rest.js +29 -22
  35. package/dist/esm/src/proxy/types/web.js +18 -11
  36. package/dist/esm/src/repositoryManager.js +28 -22
  37. package/dist/esm/src/serviceManager.js +25 -19
  38. package/dist/esm/src/socketManager.js +31 -18
  39. package/dist/esm/src/storageService.js +18 -12
  40. package/dist/esm/src/taskManager.js +12 -8
  41. package/dist/esm/src/tasks/routes.js +14 -9
  42. package/dist/esm/src/traffic/routes.js +12 -7
  43. package/dist/esm/src/types.js +11 -8
  44. package/dist/esm/src/utils/BlockInstanceRunner.js +57 -50
  45. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +11 -0
  46. package/dist/esm/src/utils/DefaultProviderInstaller.js +129 -0
  47. package/dist/esm/src/utils/LogData.js +5 -1
  48. package/dist/esm/src/utils/commandLineUtils.js +12 -7
  49. package/dist/esm/src/utils/pathTemplateParser.js +7 -2
  50. package/dist/esm/src/utils/utils.js +30 -17
  51. package/dist/esm/start.js +7 -2
  52. package/index.ts +3 -0
  53. package/package.json +10 -4
  54. package/src/instanceManager.ts +34 -8
  55. package/src/socketManager.ts +6 -0
  56. package/src/utils/DefaultProviderInstaller.ts +141 -0
  57. package/tsconfig.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ # [0.17.0](https://github.com/kapetacom/local-cluster-service/compare/v0.16.8...v0.17.0) (2023-09-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Bump dependencies ([273a75b](https://github.com/kapetacom/local-cluster-service/commit/273a75b4727cbfc19fa186849a81aebba9b85b00))
7
+ * TS 5.2 is more strict with build options ([d5a27be](https://github.com/kapetacom/local-cluster-service/commit/d5a27bed4d89d1ed557517b5ae9bfcc1dccabbb0))
8
+
9
+
10
+ ### Features
11
+
12
+ * Add default provider and sample installations ([#65](https://github.com/kapetacom/local-cluster-service/issues/65)) ([ea4fe89](https://github.com/kapetacom/local-cluster-service/commit/ea4fe899988cbbaeb5a1020517e7e88ac967e6b9))
13
+
14
+ ## [0.16.8](https://github.com/kapetacom/local-cluster-service/compare/v0.16.7...v0.16.8) (2023-08-30)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * Gracefully handled instances that have been deleted ([#64](https://github.com/kapetacom/local-cluster-service/issues/64)) ([e26ed35](https://github.com/kapetacom/local-cluster-service/commit/e26ed353e474b7417939008fb1eadec891d5ead9))
20
+
1
21
  ## [0.16.7](https://github.com/kapetacom/local-cluster-service/compare/v0.16.6...v0.16.7) (2023-08-24)
2
22
 
3
23
 
package/dist/cjs/index.js CHANGED
@@ -26,6 +26,7 @@ const utils_1 = require("./src/utils/utils");
26
26
  const request_1 = __importDefault(require("request"));
27
27
  const repositoryManager_1 = require("./src/repositoryManager");
28
28
  const commandLineUtils_1 = require("./src/utils/commandLineUtils");
29
+ const DefaultProviderInstaller_1 = require("./src/utils/DefaultProviderInstaller");
29
30
  let currentServer = null;
30
31
  function createServer() {
31
32
  const app = (0, express_1.default)();
@@ -106,6 +107,7 @@ exports.default = {
106
107
  catch (e) {
107
108
  console.error('Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.');
108
109
  }
110
+ await DefaultProviderInstaller_1.defaultProviderInstaller.checkForDefault();
109
111
  const clusterPort = storageService_1.storageService.get('cluster', 'port');
110
112
  if (clusterPort) {
111
113
  clusterService_1.clusterService.setClusterServicePort(clusterPort);
@@ -480,6 +480,36 @@ class InstanceManager {
480
480
  if (instance.ref) {
481
481
  instance.ref = (0, utils_1.normalizeKapetaUri)(instance.ref);
482
482
  }
483
+ if (instance.desiredStatus === types_1.DesiredInstanceStatus.RUN) {
484
+ // Check if the plan still exists and the instance is still in the plan
485
+ // - and that the block definition exists
486
+ try {
487
+ const plan = await assetManager_1.assetManager.getAsset(instance.systemId, true, false);
488
+ if (!plan) {
489
+ instance.desiredStatus = types_1.DesiredInstanceStatus.STOP;
490
+ changed = true;
491
+ return;
492
+ }
493
+ const planData = plan.data;
494
+ const planInstance = planData?.spec?.blocks?.find((b) => b.id === instance.instanceId);
495
+ if (!planInstance || !planInstance?.block?.ref) {
496
+ instance.desiredStatus = types_1.DesiredInstanceStatus.STOP;
497
+ changed = true;
498
+ return;
499
+ }
500
+ const blockDef = await assetManager_1.assetManager.getAsset(instance.ref, true, false);
501
+ if (!blockDef) {
502
+ instance.desiredStatus = types_1.DesiredInstanceStatus.STOP;
503
+ changed = true;
504
+ return;
505
+ }
506
+ }
507
+ catch (e) {
508
+ console.warn('Failed to check assets', instance.systemId, e);
509
+ instance.desiredStatus = types_1.DesiredInstanceStatus.STOP;
510
+ return;
511
+ }
512
+ }
483
513
  const newStatus = await this.requestInstanceStatus(instance);
484
514
  /*
485
515
  console.log('Check instance %s %s: [current: %s, new: %s, desired: %s]',
@@ -34,9 +34,15 @@ class SocketManager {
34
34
  return this._io;
35
35
  }
36
36
  emit(context, type, payload) {
37
+ if (!this._io) {
38
+ return;
39
+ }
37
40
  this.io.to(context).emit(type, { context, payload });
38
41
  }
39
42
  emitGlobal(type, payload) {
43
+ if (!this._io) {
44
+ return;
45
+ }
40
46
  this.io.emit(type, payload);
41
47
  }
42
48
  emitSystemEvent(systemId, type, payload) {
@@ -0,0 +1,11 @@
1
+ declare class DefaultProviderInstaller {
2
+ private readonly progressListener;
3
+ checkForDefault(): Promise<void>;
4
+ private install;
5
+ private linkLocal;
6
+ private scanProjectBase;
7
+ private ensureDefaultProjectHome;
8
+ private download;
9
+ }
10
+ export declare const defaultProviderInstaller: DefaultProviderInstaller;
11
+ export {};
@@ -0,0 +1,129 @@
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.defaultProviderInstaller = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const request_1 = __importDefault(require("request"));
12
+ const tar_stream_1 = require("tar-stream");
13
+ const gunzip_maybe_1 = __importDefault(require("gunzip-maybe"));
14
+ const filesystemManager_1 = require("../filesystemManager");
15
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
16
+ const progressListener_1 = require("../progressListener");
17
+ const glob_1 = require("glob");
18
+ const DEFAULT_PROVIDERS_URL = 'https://storage.googleapis.com/kapeta-production-cdn/archives/default-providers.tar.gz';
19
+ const DEFAULT_PROJECT_HOME_DIR = 'KapetaProjects';
20
+ const ARCHIVE_LOCAL_PREFIX = 'local';
21
+ class DefaultProviderInstaller {
22
+ progressListener = new progressListener_1.ProgressListener();
23
+ async checkForDefault() {
24
+ const definitions = local_cluster_config_1.default.getDefinitions();
25
+ if (definitions.length < 1) {
26
+ console.log('Installing default providers');
27
+ try {
28
+ await this.install();
29
+ }
30
+ catch (e) {
31
+ console.warn('Failed to install defaults', e);
32
+ }
33
+ }
34
+ }
35
+ async install() {
36
+ await this.download();
37
+ await this.linkLocal();
38
+ }
39
+ async linkLocal() {
40
+ const projectBase = await this.ensureDefaultProjectHome();
41
+ const folders = this.scanProjectBase(projectBase);
42
+ for (let folder of folders) {
43
+ console.log('Linking %s', folder);
44
+ await nodejs_registry_utils_1.Actions.link(this.progressListener, folder);
45
+ }
46
+ }
47
+ scanProjectBase(projectBase) {
48
+ const assetFiles = glob_1.glob.sync('*/**/kapeta.yml', { cwd: projectBase });
49
+ return assetFiles.map((assetFile) => {
50
+ return node_path_1.default.dirname(node_path_1.default.join(projectBase, assetFile));
51
+ });
52
+ }
53
+ async ensureDefaultProjectHome() {
54
+ const defaultProjectHome = node_path_1.default.join(node_os_1.default.homedir(), DEFAULT_PROJECT_HOME_DIR);
55
+ let projectBase = filesystemManager_1.filesystemManager.getProjectRootFolder();
56
+ if (!projectBase) {
57
+ filesystemManager_1.filesystemManager.setProjectRootFolder(defaultProjectHome);
58
+ projectBase = defaultProjectHome;
59
+ if (!(await fs_extra_1.default.pathExists(projectBase))) {
60
+ await fs_extra_1.default.mkdirp(projectBase);
61
+ }
62
+ }
63
+ return projectBase;
64
+ }
65
+ async download() {
66
+ const projectBase = await this.ensureDefaultProjectHome();
67
+ const repoBase = local_cluster_config_1.default.getRepositoryBasedir();
68
+ return new Promise((resolve, reject) => {
69
+ const extractor = (0, tar_stream_1.extract)();
70
+ const dirCache = new Set();
71
+ extractor.on('entry', async function (header, stream, next) {
72
+ if (header.type !== 'file') {
73
+ stream.on('end', function () {
74
+ next(); // ready for next entry
75
+ });
76
+ stream.resume(); // just auto drain the stream
77
+ return;
78
+ }
79
+ // Local (editable) assets should be stored in the project folder
80
+ // - installed assets goes into the repository folder
81
+ const baseDir = header.name.startsWith(ARCHIVE_LOCAL_PREFIX) ? projectBase : repoBase;
82
+ const parts = header.name.split(/\//g);
83
+ parts.shift();
84
+ const filename = parts.join(node_path_1.default.sep);
85
+ try {
86
+ const dirname = node_path_1.default.join(baseDir, node_path_1.default.dirname(filename));
87
+ if (!dirCache.has(dirname)) {
88
+ let dirExists = false;
89
+ try {
90
+ await fs_extra_1.default.stat(dirname);
91
+ dirExists = true;
92
+ }
93
+ catch (e) { }
94
+ if (!dirExists) {
95
+ await fs_extra_1.default.mkdirp(dirname);
96
+ }
97
+ dirCache.add(dirname);
98
+ }
99
+ const fileTarget = node_path_1.default.join(baseDir, filename);
100
+ stream.on('error', (err) => {
101
+ reject(err);
102
+ });
103
+ stream.on('end', next);
104
+ stream.pipe(fs_extra_1.default.createWriteStream(fileTarget, {
105
+ mode: header.mode,
106
+ }));
107
+ }
108
+ catch (e) {
109
+ reject(e);
110
+ }
111
+ });
112
+ extractor.on('finish', function () {
113
+ // all entries done - lets finalize it
114
+ console.log('Default providers installed');
115
+ resolve();
116
+ });
117
+ extractor.on('error', function (err) {
118
+ reject(err);
119
+ });
120
+ console.log('Downloading default providers from %s', DEFAULT_PROVIDERS_URL);
121
+ const response = (0, request_1.default)(DEFAULT_PROVIDERS_URL);
122
+ response.on('error', function (err) {
123
+ reject(err);
124
+ });
125
+ response.pipe((0, gunzip_maybe_1.default)()).pipe(extractor);
126
+ });
127
+ }
128
+ }
129
+ exports.defaultProviderInstaller = new DefaultProviderInstaller();
package/dist/esm/index.js CHANGED
@@ -1,45 +1,51 @@
1
- import { clusterService } from './src/clusterService';
2
- import { storageService } from './src/storageService';
3
- import { serviceManager } from './src/serviceManager';
4
- import { socketManager } from './src/socketManager';
5
- import { containerManager } from './src/containerManager';
6
- import express from 'express';
7
- import HTTP from 'http';
8
- import { Server } from 'socket.io';
9
- import TrafficRoutes from './src/traffic/routes';
10
- import ProxyRoutes from './src/proxy/routes';
11
- import ConfigRoutes from './src/config/routes';
12
- import InstancesRoutes from './src/instances/routes';
13
- import IdentitiesRoutes from './src/identities/routes';
14
- import FilesystemRoutes from './src/filesystem/routes';
15
- import AssetsRoutes from './src/assets/routes';
16
- import ProviderRoutes from './src/providers/routes';
17
- import AttachmentRoutes from './src/attachments/routes';
18
- import TaskRoutes from './src/tasks/routes';
19
- import APIRoutes from './src/api';
20
- import { getBindHost } from './src/utils/utils';
21
- import request from 'request';
22
- import { repositoryManager } from './src/repositoryManager';
23
- import { ensureCLI } from './src/utils/commandLineUtils';
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
+ const routes_9 = __importDefault(require("./src/attachments/routes"));
23
+ const routes_10 = __importDefault(require("./src/tasks/routes"));
24
+ const api_1 = __importDefault(require("./src/api"));
25
+ const utils_1 = require("./src/utils/utils");
26
+ const request_1 = __importDefault(require("request"));
27
+ const repositoryManager_1 = require("./src/repositoryManager");
28
+ const commandLineUtils_1 = require("./src/utils/commandLineUtils");
29
+ const DefaultProviderInstaller_1 = require("./src/utils/DefaultProviderInstaller");
24
30
  let currentServer = null;
25
31
  function createServer() {
26
- const app = express();
27
- app.use('/traffic', TrafficRoutes);
28
- app.use('/proxy', ProxyRoutes);
29
- app.use('/config', ConfigRoutes);
30
- app.use('/instances', InstancesRoutes);
31
- app.use('/identities', IdentitiesRoutes);
32
- app.use('/files', FilesystemRoutes);
33
- app.use('/assets', AssetsRoutes);
34
- app.use('/providers', ProviderRoutes);
35
- app.use('/attachments', AttachmentRoutes);
36
- app.use('/tasks', TaskRoutes);
37
- app.use('/api', APIRoutes);
32
+ const app = (0, express_1.default)();
33
+ app.use('/traffic', routes_1.default);
34
+ app.use('/proxy', routes_2.default);
35
+ app.use('/config', routes_3.default);
36
+ app.use('/instances', routes_4.default);
37
+ app.use('/identities', routes_5.default);
38
+ app.use('/files', routes_6.default);
39
+ app.use('/assets', routes_7.default);
40
+ app.use('/providers', routes_8.default);
41
+ app.use('/attachments', routes_9.default);
42
+ app.use('/tasks', routes_10.default);
43
+ app.use('/api', api_1.default);
38
44
  app.get('/status', async (req, res) => {
39
45
  res.send({
40
46
  ok: true,
41
- dockerStatus: await containerManager.checkAlive(),
42
- socketStatus: socketManager.isAlive(),
47
+ dockerStatus: await containerManager_1.containerManager.checkAlive(),
48
+ socketStatus: socketManager_1.socketManager.isAlive(),
43
49
  });
44
50
  });
45
51
  app.get('/ping', async (req, res) => {
@@ -54,18 +60,18 @@ function createServer() {
54
60
  error: 'Unknown',
55
61
  });
56
62
  });
57
- const server = HTTP.createServer(app);
63
+ const server = http_1.default.createServer(app);
58
64
  //socket
59
- const io = new Server(server, {
65
+ const io = new socket_io_1.Server(server, {
60
66
  cors: {
61
67
  //TODO: This should'nt be hardcoded but also shouldn't be "*"
62
68
  origin: 'http://localhost:8080',
63
69
  },
64
70
  });
65
- socketManager.setIo(io);
71
+ socketManager_1.socketManager.setIo(io);
66
72
  return server;
67
73
  }
68
- export default {
74
+ exports.default = {
69
75
  isRunning: function () {
70
76
  return !!currentServer;
71
77
  },
@@ -77,7 +83,7 @@ export default {
77
83
  },
78
84
  ping: async function (host, port) {
79
85
  return new Promise((resolve, reject) => {
80
- request.get(`http://${host}:${port}/ping`, (err, res, body) => {
86
+ request_1.default.get(`http://${host}:${port}/ping`, (err, res, body) => {
81
87
  if (err) {
82
88
  reject(err);
83
89
  return;
@@ -96,18 +102,19 @@ export default {
96
102
  }
97
103
  try {
98
104
  console.log('Testing docker runtime...');
99
- await containerManager.initialize();
105
+ await containerManager_1.containerManager.initialize();
100
106
  }
101
107
  catch (e) {
102
108
  console.error('Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.');
103
109
  }
104
- const clusterPort = storageService.get('cluster', 'port');
110
+ await DefaultProviderInstaller_1.defaultProviderInstaller.checkForDefault();
111
+ const clusterPort = storageService_1.storageService.get('cluster', 'port');
105
112
  if (clusterPort) {
106
- clusterService.setClusterServicePort(clusterPort);
113
+ clusterService_1.clusterService.setClusterServicePort(clusterPort);
107
114
  }
108
- const clusterHost = storageService.get('cluster', 'host');
115
+ const clusterHost = storageService_1.storageService.get('cluster', 'host');
109
116
  if (clusterHost) {
110
- clusterService.setClusterServiceHost(clusterHost);
117
+ clusterService_1.clusterService.setClusterServiceHost(clusterHost);
111
118
  }
112
119
  let pingResult = undefined;
113
120
  try {
@@ -119,15 +126,15 @@ export default {
119
126
  if (pingResult?.ok) {
120
127
  throw new Error(`Cluster service already running on: ${clusterHost}:${clusterPort}.`);
121
128
  }
122
- await clusterService.init();
129
+ await clusterService_1.clusterService.init();
123
130
  currentServer = createServer();
124
- const port = clusterService.getClusterServicePort();
125
- const host = clusterService.getClusterServiceHost();
131
+ const port = clusterService_1.clusterService.getClusterServicePort();
132
+ const host = clusterService_1.clusterService.getClusterServiceHost();
126
133
  if (clusterPort !== port) {
127
- storageService.put('cluster', 'port', port);
134
+ storageService_1.storageService.put('cluster', 'port', port);
128
135
  }
129
136
  if (clusterHost !== host) {
130
- storageService.put('cluster', 'host', host);
137
+ storageService_1.storageService.put('cluster', 'host', host);
131
138
  }
132
139
  return new Promise(async (resolve, reject) => {
133
140
  if (!currentServer) {
@@ -141,22 +148,22 @@ export default {
141
148
  }
142
149
  reject(err);
143
150
  });
144
- const bindHost = getBindHost(host);
151
+ const bindHost = (0, utils_1.getBindHost)(host);
145
152
  currentServer.listen(port, bindHost, () => {
146
153
  try {
147
- ensureCLI().catch((e) => console.error('Failed to install CLI.', e));
154
+ (0, commandLineUtils_1.ensureCLI)().catch((e) => console.error('Failed to install CLI.', e));
148
155
  }
149
156
  catch (e) {
150
157
  console.error('Failed to install CLI.', e);
151
158
  }
152
159
  try {
153
160
  // Start installation process for all default providers
154
- repositoryManager.ensureDefaultProviders();
161
+ repositoryManager_1.repositoryManager.ensureDefaultProviders();
155
162
  }
156
163
  catch (e) {
157
164
  console.error('Failed to install default providers.', e);
158
165
  }
159
- resolve({ host, port, dockerStatus: containerManager.isAlive() });
166
+ resolve({ host, port, dockerStatus: containerManager_1.containerManager.isAlive() });
160
167
  });
161
168
  currentServer.host = host;
162
169
  currentServer.port = port;
@@ -177,5 +184,5 @@ export default {
177
184
  }
178
185
  return Promise.resolve(false);
179
186
  },
180
- getServices: () => serviceManager.getServices(),
187
+ getServices: () => serviceManager_1.serviceManager.getServices(),
181
188
  };
@@ -1,14 +1,20 @@
1
- import chokidar from 'chokidar';
2
- import ClusterConfiguration from '@kapeta/local-cluster-config';
3
- import FS from 'fs-extra';
4
- import Path from 'node:path';
5
- import YAML from 'yaml';
6
- import { parseKapetaUri } from '@kapeta/nodejs-utils';
7
- import _ from 'lodash';
8
- import { socketManager } from './socketManager';
9
- import { cacheManager } from './cacheManager';
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.RepositoryWatcher = void 0;
7
+ const chokidar_1 = __importDefault(require("chokidar"));
8
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
9
+ const fs_extra_1 = __importDefault(require("fs-extra"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const yaml_1 = __importDefault(require("yaml"));
12
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
13
+ const lodash_1 = __importDefault(require("lodash"));
14
+ const socketManager_1 = require("./socketManager");
15
+ const cacheManager_1 = require("./cacheManager");
10
16
  const KAPETA_YML_RX = /^kapeta.ya?ml$/;
11
- export class RepositoryWatcher {
17
+ class RepositoryWatcher {
12
18
  watcher;
13
19
  disabled = false;
14
20
  baseDir;
@@ -16,18 +22,18 @@ export class RepositoryWatcher {
16
22
  symbolicLinks = {};
17
23
  sourceOfChange = new Map();
18
24
  constructor() {
19
- this.baseDir = ClusterConfiguration.getRepositoryBasedir();
25
+ this.baseDir = local_cluster_config_1.default.getRepositoryBasedir();
20
26
  }
21
27
  setDisabled(disabled) {
22
28
  this.disabled = disabled;
23
29
  }
24
30
  watch() {
25
- if (!FS.existsSync(this.baseDir)) {
26
- FS.mkdirpSync(this.baseDir);
31
+ if (!fs_extra_1.default.existsSync(this.baseDir)) {
32
+ fs_extra_1.default.mkdirpSync(this.baseDir);
27
33
  }
28
- this.allDefinitions = ClusterConfiguration.getDefinitions();
34
+ this.allDefinitions = local_cluster_config_1.default.getDefinitions();
29
35
  try {
30
- this.watcher = chokidar.watch(this.baseDir, {
36
+ this.watcher = chokidar_1.default.watch(this.baseDir, {
31
37
  followSymlinks: false,
32
38
  ignorePermissionErrors: true,
33
39
  disableGlobbing: true,
@@ -53,7 +59,7 @@ export class RepositoryWatcher {
53
59
  async setSourceOfChangeFor(file, source) {
54
60
  this.sourceOfChange.set(file, source);
55
61
  try {
56
- const realPath = await FS.realpath(file);
62
+ const realPath = await fs_extra_1.default.realpath(file);
57
63
  if (realPath !== file) {
58
64
  this.sourceOfChange.set(realPath, source);
59
65
  }
@@ -65,7 +71,7 @@ export class RepositoryWatcher {
65
71
  async clearSourceOfChangeFor(file) {
66
72
  this.sourceOfChange.delete(file);
67
73
  try {
68
- const realPath = await FS.realpath(file);
74
+ const realPath = await fs_extra_1.default.realpath(file);
69
75
  if (realPath !== file) {
70
76
  this.sourceOfChange.delete(realPath);
71
77
  }
@@ -83,10 +89,10 @@ export class RepositoryWatcher {
83
89
  this.watcher = undefined;
84
90
  }
85
91
  async getAssetIdentity(path) {
86
- const baseName = Path.basename(path);
92
+ const baseName = node_path_1.default.basename(path);
87
93
  let handle, name, version;
88
94
  if (path.startsWith(this.baseDir)) {
89
- const relativePath = Path.relative(this.baseDir, path);
95
+ const relativePath = node_path_1.default.relative(this.baseDir, path);
90
96
  // Inside the repo we can use the path to determine the handle, name and version
91
97
  [handle, name, version] = relativePath.split(/\//g);
92
98
  if (!handle || !name || !version) {
@@ -107,8 +113,8 @@ export class RepositoryWatcher {
107
113
  // Version is always 'local'
108
114
  version = 'local';
109
115
  try {
110
- const definition = YAML.parse((await FS.readFile(path)).toString());
111
- const uri = parseKapetaUri(definition.metadata.name);
116
+ const definition = yaml_1.default.parse((await fs_extra_1.default.readFile(path)).toString());
117
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(definition.metadata.name);
112
118
  handle = uri.handle;
113
119
  name = uri.name;
114
120
  return {
@@ -155,15 +161,15 @@ export class RepositoryWatcher {
155
161
  this.sourceOfChange.delete(path);
156
162
  }
157
163
  async checkForChange(assetIdentity, sourceOfChange) {
158
- const ymlPath = Path.join(this.baseDir, assetIdentity.handle, assetIdentity.name, assetIdentity.version, 'kapeta.yml');
159
- const newDefinitions = ClusterConfiguration.getDefinitions();
164
+ const ymlPath = node_path_1.default.join(this.baseDir, assetIdentity.handle, assetIdentity.name, assetIdentity.version, 'kapeta.yml');
165
+ const newDefinitions = local_cluster_config_1.default.getDefinitions();
160
166
  const newDefinition = newDefinitions.find((d) => d.ymlPath === ymlPath);
161
167
  let currentDefinition = this.allDefinitions.find((d) => d.ymlPath === ymlPath);
162
168
  const ymlExists = await this.exists(ymlPath);
163
169
  let type;
164
170
  if (ymlExists) {
165
171
  if (currentDefinition) {
166
- if (newDefinition && _.isEqual(currentDefinition, newDefinition)) {
172
+ if (newDefinition && lodash_1.default.isEqual(currentDefinition, newDefinition)) {
167
173
  //Definition was not changed
168
174
  return;
169
175
  }
@@ -180,7 +186,7 @@ export class RepositoryWatcher {
180
186
  }
181
187
  else {
182
188
  if (currentDefinition) {
183
- const ref = parseKapetaUri(`${currentDefinition.definition.metadata.name}:${currentDefinition.version}`).id;
189
+ const ref = (0, nodejs_utils_1.parseKapetaUri)(`${currentDefinition.definition.metadata.name}:${currentDefinition.version}`).id;
184
190
  //Something was removed
185
191
  type = 'removed';
186
192
  }
@@ -197,12 +203,12 @@ export class RepositoryWatcher {
197
203
  };
198
204
  this.allDefinitions = newDefinitions;
199
205
  //console.log('Asset changed', payload);
200
- socketManager.emitGlobal('asset-change', payload);
201
- cacheManager.flush();
206
+ socketManager_1.socketManager.emitGlobal('asset-change', payload);
207
+ cacheManager_1.cacheManager.flush();
202
208
  }
203
209
  async exists(path) {
204
210
  try {
205
- await FS.access(path);
211
+ await fs_extra_1.default.access(path);
206
212
  return true;
207
213
  }
208
214
  catch (e) {
@@ -228,9 +234,9 @@ export class RepositoryWatcher {
228
234
  try {
229
235
  // Make sure we're not watching the symlink target
230
236
  await this.removeSymlinkTarget(path);
231
- const stat = await FS.lstat(path);
237
+ const stat = await fs_extra_1.default.lstat(path);
232
238
  if (stat.isSymbolicLink()) {
233
- const realPath = `${await FS.realpath(path)}/kapeta.yml`;
239
+ const realPath = `${await fs_extra_1.default.realpath(path)}/kapeta.yml`;
234
240
  if (await this.exists(realPath)) {
235
241
  //console.log('Watching symlink target %s => %s', path, realPath);
236
242
  this.watcher?.add(realPath);
@@ -250,13 +256,13 @@ export class RepositoryWatcher {
250
256
  if (path.includes('/node_modules/')) {
251
257
  return true;
252
258
  }
253
- const filename = Path.basename(path);
259
+ const filename = node_path_1.default.basename(path);
254
260
  if (filename.startsWith('.')) {
255
261
  return true;
256
262
  }
257
- const relativePath = Path.relative(this.baseDir, path).split(Path.sep);
263
+ const relativePath = node_path_1.default.relative(this.baseDir, path).split(node_path_1.default.sep);
258
264
  try {
259
- if (FS.statSync(path).isDirectory()) {
265
+ if (fs_extra_1.default.statSync(path).isDirectory()) {
260
266
  if (relativePath.length > 3) {
261
267
  return true;
262
268
  }
@@ -270,3 +276,4 @@ export class RepositoryWatcher {
270
276
  return !/^kapeta\.ya?ml$/.test(filename);
271
277
  }
272
278
  }
279
+ exports.RepositoryWatcher = RepositoryWatcher;
@@ -1,21 +1,26 @@
1
- import Router from 'express-promise-router';
2
- import { corsHandler } from './middleware/cors';
3
- import { KapetaAPI } from '@kapeta/nodejs-api-client';
4
- import ClusterConfiguration from '@kapeta/local-cluster-config';
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 cors_1 = require("./middleware/cors");
8
+ const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
9
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
5
10
  const { createAPIRoute } = require('@kapeta/web-microfrontend/server');
6
11
  const packageJson = require('../package.json');
7
- const router = Router();
8
- const remoteServices = ClusterConfiguration.getClusterConfig().remoteServices ?? {};
9
- router.use('/', corsHandler);
12
+ const router = (0, express_promise_router_1.default)();
13
+ const remoteServices = local_cluster_config_1.default.getClusterConfig().remoteServices ?? {};
14
+ router.use('/', cors_1.corsHandler);
10
15
  router.use('/registry', createAPIRoute(remoteServices.registry ?? 'https://registry.kapeta.com', {
11
16
  nonce: false,
12
17
  userAgent: `KapetaDesktopCluster/${packageJson.version}`,
13
18
  tokenFetcher: () => {
14
- const api = new KapetaAPI();
19
+ const api = new nodejs_api_client_1.KapetaAPI();
15
20
  if (api.hasToken()) {
16
21
  return api.getAccessToken();
17
22
  }
18
23
  return null;
19
24
  },
20
25
  }));
21
- export default router;
26
+ exports.default = router;