@kapeta/local-cluster-service 0.16.8 → 0.18.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 (96) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index.js +6 -2
  3. package/dist/cjs/src/assetManager.d.ts +2 -2
  4. package/dist/cjs/src/assetManager.js +16 -16
  5. package/dist/cjs/src/assets/routes.js +2 -2
  6. package/dist/cjs/src/authManager.d.ts +12 -0
  7. package/dist/cjs/src/authManager.js +60 -0
  8. package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
  9. package/dist/cjs/src/codeGeneratorManager.js +3 -3
  10. package/dist/cjs/src/configManager.js +2 -2
  11. package/dist/cjs/src/definitionsManager.d.ts +7 -6
  12. package/dist/cjs/src/definitionsManager.js +102 -18
  13. package/dist/cjs/src/instanceManager.d.ts +1 -1
  14. package/dist/cjs/src/instanceManager.js +4 -4
  15. package/dist/cjs/src/instances/routes.js +2 -2
  16. package/dist/cjs/src/operatorManager.d.ts +1 -1
  17. package/dist/cjs/src/operatorManager.js +7 -9
  18. package/dist/cjs/src/providerManager.d.ts +2 -1
  19. package/dist/cjs/src/providerManager.js +23 -15
  20. package/dist/cjs/src/repositoryManager.d.ts +2 -2
  21. package/dist/cjs/src/repositoryManager.js +8 -9
  22. package/dist/cjs/src/socketManager.js +6 -0
  23. package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
  24. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
  25. package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
  26. package/dist/esm/index.js +67 -58
  27. package/dist/esm/src/RepositoryWatcher.js +40 -33
  28. package/dist/esm/src/api.js +14 -9
  29. package/dist/esm/src/assetManager.d.ts +2 -2
  30. package/dist/esm/src/assetManager.js +73 -67
  31. package/dist/esm/src/assets/routes.js +23 -18
  32. package/dist/esm/src/attachments/routes.js +14 -9
  33. package/dist/esm/src/authManager.d.ts +12 -0
  34. package/dist/esm/src/authManager.js +60 -0
  35. package/dist/esm/src/cacheManager.js +13 -5
  36. package/dist/esm/src/clusterService.js +6 -3
  37. package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
  38. package/dist/esm/src/codeGeneratorManager.js +20 -14
  39. package/dist/esm/src/config/routes.js +30 -25
  40. package/dist/esm/src/configManager.js +29 -26
  41. package/dist/esm/src/containerManager.js +48 -39
  42. package/dist/esm/src/definitionsManager.d.ts +7 -6
  43. package/dist/esm/src/definitionsManager.js +114 -24
  44. package/dist/esm/src/filesystem/routes.js +21 -16
  45. package/dist/esm/src/filesystemManager.js +23 -17
  46. package/dist/esm/src/identities/routes.js +13 -8
  47. package/dist/esm/src/instanceManager.d.ts +1 -1
  48. package/dist/esm/src/instanceManager.js +165 -158
  49. package/dist/esm/src/instances/routes.js +39 -34
  50. package/dist/esm/src/middleware/cors.js +5 -1
  51. package/dist/esm/src/middleware/kapeta.js +8 -4
  52. package/dist/esm/src/middleware/stringBody.js +5 -1
  53. package/dist/esm/src/networkManager.js +15 -9
  54. package/dist/esm/src/operatorManager.d.ts +1 -1
  55. package/dist/esm/src/operatorManager.js +48 -44
  56. package/dist/esm/src/progressListener.js +16 -12
  57. package/dist/esm/src/providerManager.d.ts +2 -1
  58. package/dist/esm/src/providerManager.js +43 -29
  59. package/dist/esm/src/providers/routes.js +14 -9
  60. package/dist/esm/src/proxy/routes.js +26 -21
  61. package/dist/esm/src/proxy/types/rest.js +29 -22
  62. package/dist/esm/src/proxy/types/web.js +18 -11
  63. package/dist/esm/src/repositoryManager.d.ts +2 -2
  64. package/dist/esm/src/repositoryManager.js +33 -28
  65. package/dist/esm/src/serviceManager.js +25 -19
  66. package/dist/esm/src/socketManager.js +31 -18
  67. package/dist/esm/src/storageService.js +18 -12
  68. package/dist/esm/src/taskManager.js +12 -8
  69. package/dist/esm/src/tasks/routes.js +14 -9
  70. package/dist/esm/src/traffic/routes.js +12 -7
  71. package/dist/esm/src/types.js +11 -8
  72. package/dist/esm/src/utils/BlockInstanceRunner.js +60 -55
  73. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +11 -0
  74. package/dist/esm/src/utils/DefaultProviderInstaller.js +129 -0
  75. package/dist/esm/src/utils/LogData.js +5 -1
  76. package/dist/esm/src/utils/commandLineUtils.js +12 -7
  77. package/dist/esm/src/utils/pathTemplateParser.js +7 -2
  78. package/dist/esm/src/utils/utils.js +30 -17
  79. package/dist/esm/start.js +7 -2
  80. package/index.ts +7 -2
  81. package/package.json +10 -4
  82. package/src/assetManager.ts +18 -16
  83. package/src/assets/routes.ts +2 -2
  84. package/src/authManager.ts +62 -0
  85. package/src/codeGeneratorManager.ts +3 -3
  86. package/src/configManager.ts +2 -2
  87. package/src/definitionsManager.ts +132 -17
  88. package/src/instanceManager.ts +5 -5
  89. package/src/instances/routes.ts +2 -2
  90. package/src/operatorManager.ts +7 -12
  91. package/src/providerManager.ts +27 -19
  92. package/src/repositoryManager.ts +8 -11
  93. package/src/socketManager.ts +6 -0
  94. package/src/utils/BlockInstanceRunner.ts +6 -8
  95. package/src/utils/DefaultProviderInstaller.ts +141 -0
  96. package/tsconfig.json +3 -2
@@ -12,8 +12,8 @@ declare class RepositoryManager {
12
12
  */
13
13
  setSourceOfChangeFor(file: string, source: SourceOfChange): Promise<void>;
14
14
  clearSourceOfChangeFor(file: string): Promise<void>;
15
- ensureDefaultProviders(): void;
16
- private _install;
15
+ ensureDefaultProviders(): Promise<void>;
16
+ private scheduleInstallation;
17
17
  ensureAsset(handle: string, name: string, version: string, wait?: boolean): Promise<undefined | Task[]>;
18
18
  }
19
19
  export declare const repositoryManager: RepositoryManager;
@@ -53,18 +53,18 @@ class RepositoryManager {
53
53
  clearSourceOfChangeFor(file) {
54
54
  return this.watcher.clearSourceOfChangeFor(file);
55
55
  }
56
- ensureDefaultProviders() {
56
+ async ensureDefaultProviders() {
57
57
  socketManager_1.socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_START, { providers: DEFAULT_PROVIDERS });
58
- const tasks = this._install(DEFAULT_PROVIDERS);
58
+ const tasks = await this.scheduleInstallation(DEFAULT_PROVIDERS);
59
59
  Promise.allSettled(tasks.map((t) => t.wait())).then(() => {
60
60
  socketManager_1.socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_END, {});
61
61
  });
62
62
  }
63
- _install(refs) {
63
+ async scheduleInstallation(refs) {
64
64
  //We make sure to only install one asset at a time - otherwise unexpected things might happen
65
65
  const createInstaller = (ref) => {
66
66
  return async () => {
67
- if (definitionsManager_1.definitionsManager.exists(ref)) {
67
+ if (await definitionsManager_1.definitionsManager.exists(ref)) {
68
68
  return;
69
69
  }
70
70
  //console.log(`Installing asset: ${ref}`);
@@ -89,7 +89,7 @@ class RepositoryManager {
89
89
  continue;
90
90
  }
91
91
  ref = (0, utils_1.normalizeKapetaUri)(ref);
92
- if (definitionsManager_1.definitionsManager.exists(ref)) {
92
+ if (await definitionsManager_1.definitionsManager.exists(ref)) {
93
93
  continue;
94
94
  }
95
95
  const task = taskManager_1.taskManager.add(`asset:install:${ref}`, createInstaller(ref), {
@@ -107,8 +107,7 @@ class RepositoryManager {
107
107
  //TODO: Get dependencies for local asset
108
108
  return;
109
109
  }
110
- const definitions = definitionsManager_1.definitionsManager.getDefinitions();
111
- const installedAsset = definitions.find((d) => d.definition.metadata.name === fullName && d.version === version);
110
+ const installedAsset = await definitionsManager_1.definitionsManager.getDefinition(`${fullName}:${version}`);
112
111
  let assetVersion;
113
112
  try {
114
113
  assetVersion = await this._registryService.getVersion(fullName, version);
@@ -125,13 +124,13 @@ class RepositoryManager {
125
124
  }
126
125
  let tasks = undefined;
127
126
  if (!installedAsset) {
128
- tasks = this._install([ref]);
127
+ tasks = await this.scheduleInstallation([ref]);
129
128
  }
130
129
  else {
131
130
  //Ensure dependencies are installed
132
131
  const refs = assetVersion.dependencies.map((dep) => dep.name);
133
132
  if (refs.length > 0) {
134
- tasks = this._install(refs);
133
+ tasks = await this.scheduleInstallation(refs);
135
134
  }
136
135
  }
137
136
  if (tasks && wait) {
@@ -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) {
@@ -27,8 +27,9 @@ const DOCKER_ENV_VARS = [
27
27
  `KAPETA_LOCAL_CLUSTER_HOST=host.docker.internal`,
28
28
  `KAPETA_ENVIRONMENT_TYPE=docker`,
29
29
  ];
30
- function getProvider(uri) {
31
- return definitionsManager_1.definitionsManager.getProviderDefinitions().find((provider) => {
30
+ async function getProvider(uri) {
31
+ const providers = await definitionsManager_1.definitionsManager.getProviderDefinitions();
32
+ return providers.find((provider) => {
32
33
  const ref = `${provider.definition.metadata.name}:${provider.version}`;
33
34
  return (0, nodejs_utils_1.parseKapetaUri)(ref).id === uri.id;
34
35
  });
@@ -76,15 +77,12 @@ class BlockInstanceRunner {
76
77
  if (!blockUri.version) {
77
78
  blockUri.version = 'local';
78
79
  }
79
- const assetVersion = definitionsManager_1.definitionsManager.getDefinitions().find((definitions) => {
80
- const ref = `${definitions.definition.metadata.name}:${definitions.version}`;
81
- return (0, nodejs_utils_1.parseKapetaUri)(ref).id === blockUri.id;
82
- });
80
+ const assetVersion = await definitionsManager_1.definitionsManager.getDefinition(blockUri.id);
83
81
  if (!assetVersion) {
84
82
  throw new Error(`Block definition not found: ${blockUri.id}`);
85
83
  }
86
84
  const kindUri = (0, nodejs_utils_1.parseKapetaUri)(assetVersion.definition.kind);
87
- const providerVersion = getProvider(kindUri);
85
+ const providerVersion = await getProvider(kindUri);
88
86
  if (!providerVersion) {
89
87
  throw new Error(`Kind not found: ${kindUri.id}`);
90
88
  }
@@ -120,7 +118,7 @@ class BlockInstanceRunner {
120
118
  throw new Error('Missing target kind in block definition');
121
119
  }
122
120
  const kindUri = (0, nodejs_utils_1.parseKapetaUri)(assetVersion.definition.spec?.target?.kind);
123
- const targetVersion = getProvider(kindUri);
121
+ const targetVersion = await getProvider(kindUri);
124
122
  if (!targetVersion) {
125
123
  throw new Error(`Target not found: ${kindUri.id}`);
126
124
  }
@@ -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,52 @@
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");
30
+ const authManager_1 = require("./src/authManager");
24
31
  let currentServer = null;
25
32
  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);
33
+ const app = (0, express_1.default)();
34
+ app.use('/traffic', routes_1.default);
35
+ app.use('/proxy', routes_2.default);
36
+ app.use('/config', routes_3.default);
37
+ app.use('/instances', routes_4.default);
38
+ app.use('/identities', routes_5.default);
39
+ app.use('/files', routes_6.default);
40
+ app.use('/assets', routes_7.default);
41
+ app.use('/providers', routes_8.default);
42
+ app.use('/attachments', routes_9.default);
43
+ app.use('/tasks', routes_10.default);
44
+ app.use('/api', api_1.default);
38
45
  app.get('/status', async (req, res) => {
39
46
  res.send({
40
47
  ok: true,
41
- dockerStatus: await containerManager.checkAlive(),
42
- socketStatus: socketManager.isAlive(),
48
+ dockerStatus: await containerManager_1.containerManager.checkAlive(),
49
+ socketStatus: socketManager_1.socketManager.isAlive(),
43
50
  });
44
51
  });
45
52
  app.get('/ping', async (req, res) => {
@@ -54,18 +61,18 @@ function createServer() {
54
61
  error: 'Unknown',
55
62
  });
56
63
  });
57
- const server = HTTP.createServer(app);
64
+ const server = http_1.default.createServer(app);
58
65
  //socket
59
- const io = new Server(server, {
66
+ const io = new socket_io_1.Server(server, {
60
67
  cors: {
61
68
  //TODO: This should'nt be hardcoded but also shouldn't be "*"
62
69
  origin: 'http://localhost:8080',
63
70
  },
64
71
  });
65
- socketManager.setIo(io);
72
+ socketManager_1.socketManager.setIo(io);
66
73
  return server;
67
74
  }
68
- export default {
75
+ exports.default = {
69
76
  isRunning: function () {
70
77
  return !!currentServer;
71
78
  },
@@ -77,7 +84,7 @@ export default {
77
84
  },
78
85
  ping: async function (host, port) {
79
86
  return new Promise((resolve, reject) => {
80
- request.get(`http://${host}:${port}/ping`, (err, res, body) => {
87
+ request_1.default.get(`http://${host}:${port}/ping`, (err, res, body) => {
81
88
  if (err) {
82
89
  reject(err);
83
90
  return;
@@ -96,18 +103,19 @@ export default {
96
103
  }
97
104
  try {
98
105
  console.log('Testing docker runtime...');
99
- await containerManager.initialize();
106
+ await containerManager_1.containerManager.initialize();
100
107
  }
101
108
  catch (e) {
102
109
  console.error('Could not ping docker runtime: ' + e.toString() + '. Make sure docker is running and working.');
103
110
  }
104
- const clusterPort = storageService.get('cluster', 'port');
111
+ await DefaultProviderInstaller_1.defaultProviderInstaller.checkForDefault();
112
+ const clusterPort = storageService_1.storageService.get('cluster', 'port');
105
113
  if (clusterPort) {
106
- clusterService.setClusterServicePort(clusterPort);
114
+ clusterService_1.clusterService.setClusterServicePort(clusterPort);
107
115
  }
108
- const clusterHost = storageService.get('cluster', 'host');
116
+ const clusterHost = storageService_1.storageService.get('cluster', 'host');
109
117
  if (clusterHost) {
110
- clusterService.setClusterServiceHost(clusterHost);
118
+ clusterService_1.clusterService.setClusterServiceHost(clusterHost);
111
119
  }
112
120
  let pingResult = undefined;
113
121
  try {
@@ -119,15 +127,16 @@ export default {
119
127
  if (pingResult?.ok) {
120
128
  throw new Error(`Cluster service already running on: ${clusterHost}:${clusterPort}.`);
121
129
  }
122
- await clusterService.init();
130
+ await clusterService_1.clusterService.init();
131
+ await authManager_1.authManager.listenForChanges();
123
132
  currentServer = createServer();
124
- const port = clusterService.getClusterServicePort();
125
- const host = clusterService.getClusterServiceHost();
133
+ const port = clusterService_1.clusterService.getClusterServicePort();
134
+ const host = clusterService_1.clusterService.getClusterServiceHost();
126
135
  if (clusterPort !== port) {
127
- storageService.put('cluster', 'port', port);
136
+ storageService_1.storageService.put('cluster', 'port', port);
128
137
  }
129
138
  if (clusterHost !== host) {
130
- storageService.put('cluster', 'host', host);
139
+ storageService_1.storageService.put('cluster', 'host', host);
131
140
  }
132
141
  return new Promise(async (resolve, reject) => {
133
142
  if (!currentServer) {
@@ -141,22 +150,22 @@ export default {
141
150
  }
142
151
  reject(err);
143
152
  });
144
- const bindHost = getBindHost(host);
145
- currentServer.listen(port, bindHost, () => {
153
+ const bindHost = (0, utils_1.getBindHost)(host);
154
+ currentServer.listen(port, bindHost, async () => {
146
155
  try {
147
- ensureCLI().catch((e) => console.error('Failed to install CLI.', e));
156
+ (0, commandLineUtils_1.ensureCLI)().catch((e) => console.error('Failed to install CLI.', e));
148
157
  }
149
158
  catch (e) {
150
159
  console.error('Failed to install CLI.', e);
151
160
  }
152
161
  try {
153
162
  // Start installation process for all default providers
154
- repositoryManager.ensureDefaultProviders();
163
+ await repositoryManager_1.repositoryManager.ensureDefaultProviders();
155
164
  }
156
165
  catch (e) {
157
166
  console.error('Failed to install default providers.', e);
158
167
  }
159
- resolve({ host, port, dockerStatus: containerManager.isAlive() });
168
+ resolve({ host, port, dockerStatus: containerManager_1.containerManager.isAlive() });
160
169
  });
161
170
  currentServer.host = host;
162
171
  currentServer.port = port;
@@ -177,5 +186,5 @@ export default {
177
186
  }
178
187
  return Promise.resolve(false);
179
188
  },
180
- getServices: () => serviceManager.getServices(),
189
+ getServices: () => serviceManager_1.serviceManager.getServices(),
181
190
  };
@@ -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;