@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.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/src/instanceManager.js +30 -0
- package/dist/cjs/src/socketManager.js +6 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/index.js +64 -57
- package/dist/esm/src/RepositoryWatcher.js +40 -33
- package/dist/esm/src/api.js +14 -9
- package/dist/esm/src/assetManager.js +62 -56
- package/dist/esm/src/assets/routes.js +22 -17
- package/dist/esm/src/attachments/routes.js +14 -9
- package/dist/esm/src/cacheManager.js +13 -5
- package/dist/esm/src/clusterService.js +6 -3
- package/dist/esm/src/codeGeneratorManager.js +19 -13
- package/dist/esm/src/config/routes.js +30 -25
- package/dist/esm/src/configManager.js +29 -26
- package/dist/esm/src/containerManager.js +48 -39
- package/dist/esm/src/definitionsManager.js +15 -9
- package/dist/esm/src/filesystem/routes.js +21 -16
- package/dist/esm/src/filesystemManager.js +23 -17
- package/dist/esm/src/identities/routes.js +13 -8
- package/dist/esm/src/instanceManager.js +186 -149
- package/dist/esm/src/instances/routes.js +38 -33
- package/dist/esm/src/middleware/cors.js +5 -1
- package/dist/esm/src/middleware/kapeta.js +8 -4
- package/dist/esm/src/middleware/stringBody.js +5 -1
- package/dist/esm/src/networkManager.js +15 -9
- package/dist/esm/src/operatorManager.js +45 -39
- package/dist/esm/src/progressListener.js +16 -12
- package/dist/esm/src/providerManager.js +22 -16
- package/dist/esm/src/providers/routes.js +14 -9
- package/dist/esm/src/proxy/routes.js +26 -21
- package/dist/esm/src/proxy/types/rest.js +29 -22
- package/dist/esm/src/proxy/types/web.js +18 -11
- package/dist/esm/src/repositoryManager.js +28 -22
- package/dist/esm/src/serviceManager.js +25 -19
- package/dist/esm/src/socketManager.js +31 -18
- package/dist/esm/src/storageService.js +18 -12
- package/dist/esm/src/taskManager.js +12 -8
- package/dist/esm/src/tasks/routes.js +14 -9
- package/dist/esm/src/traffic/routes.js +12 -7
- package/dist/esm/src/types.js +11 -8
- package/dist/esm/src/utils/BlockInstanceRunner.js +57 -50
- package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/src/utils/LogData.js +5 -1
- package/dist/esm/src/utils/commandLineUtils.js +12 -7
- package/dist/esm/src/utils/pathTemplateParser.js +7 -2
- package/dist/esm/src/utils/utils.js +30 -17
- package/dist/esm/start.js +7 -2
- package/index.ts +3 -0
- package/package.json +10 -4
- package/src/instanceManager.ts +34 -8
- package/src/socketManager.ts +6 -0
- package/src/utils/DefaultProviderInstaller.ts +141 -0
- 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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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 =
|
27
|
-
app.use('/traffic',
|
28
|
-
app.use('/proxy',
|
29
|
-
app.use('/config',
|
30
|
-
app.use('/instances',
|
31
|
-
app.use('/identities',
|
32
|
-
app.use('/files',
|
33
|
-
app.use('/assets',
|
34
|
-
app.use('/providers',
|
35
|
-
app.use('/attachments',
|
36
|
-
app.use('/tasks',
|
37
|
-
app.use('/api',
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
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 =
|
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 (!
|
26
|
-
|
31
|
+
if (!fs_extra_1.default.existsSync(this.baseDir)) {
|
32
|
+
fs_extra_1.default.mkdirpSync(this.baseDir);
|
27
33
|
}
|
28
|
-
this.allDefinitions =
|
34
|
+
this.allDefinitions = local_cluster_config_1.default.getDefinitions();
|
29
35
|
try {
|
30
|
-
this.watcher =
|
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
|
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
|
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 =
|
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 =
|
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 =
|
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 =
|
159
|
-
const newDefinitions =
|
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 &&
|
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
|
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
|
237
|
+
const stat = await fs_extra_1.default.lstat(path);
|
232
238
|
if (stat.isSymbolicLink()) {
|
233
|
-
const realPath = `${await
|
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 =
|
259
|
+
const filename = node_path_1.default.basename(path);
|
254
260
|
if (filename.startsWith('.')) {
|
255
261
|
return true;
|
256
262
|
}
|
257
|
-
const relativePath =
|
263
|
+
const relativePath = node_path_1.default.relative(this.baseDir, path).split(node_path_1.default.sep);
|
258
264
|
try {
|
259
|
-
if (
|
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;
|
package/dist/esm/src/api.js
CHANGED
@@ -1,21 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
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 =
|
8
|
-
const 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
|
-
|
26
|
+
exports.default = router;
|