@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.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/index.js +6 -2
- package/dist/cjs/src/assetManager.d.ts +2 -2
- package/dist/cjs/src/assetManager.js +16 -16
- package/dist/cjs/src/assets/routes.js +2 -2
- package/dist/cjs/src/authManager.d.ts +12 -0
- package/dist/cjs/src/authManager.js +60 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
- package/dist/cjs/src/codeGeneratorManager.js +3 -3
- package/dist/cjs/src/configManager.js +2 -2
- package/dist/cjs/src/definitionsManager.d.ts +7 -6
- package/dist/cjs/src/definitionsManager.js +102 -18
- package/dist/cjs/src/instanceManager.d.ts +1 -1
- package/dist/cjs/src/instanceManager.js +4 -4
- package/dist/cjs/src/instances/routes.js +2 -2
- package/dist/cjs/src/operatorManager.d.ts +1 -1
- package/dist/cjs/src/operatorManager.js +7 -9
- package/dist/cjs/src/providerManager.d.ts +2 -1
- package/dist/cjs/src/providerManager.js +23 -15
- package/dist/cjs/src/repositoryManager.d.ts +2 -2
- package/dist/cjs/src/repositoryManager.js +8 -9
- package/dist/cjs/src/socketManager.js +6 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/index.js +67 -58
- package/dist/esm/src/RepositoryWatcher.js +40 -33
- package/dist/esm/src/api.js +14 -9
- package/dist/esm/src/assetManager.d.ts +2 -2
- package/dist/esm/src/assetManager.js +73 -67
- package/dist/esm/src/assets/routes.js +23 -18
- package/dist/esm/src/attachments/routes.js +14 -9
- package/dist/esm/src/authManager.d.ts +12 -0
- package/dist/esm/src/authManager.js +60 -0
- package/dist/esm/src/cacheManager.js +13 -5
- package/dist/esm/src/clusterService.js +6 -3
- package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
- package/dist/esm/src/codeGeneratorManager.js +20 -14
- 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.d.ts +7 -6
- package/dist/esm/src/definitionsManager.js +114 -24
- 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.d.ts +1 -1
- package/dist/esm/src/instanceManager.js +165 -158
- package/dist/esm/src/instances/routes.js +39 -34
- 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.d.ts +1 -1
- package/dist/esm/src/operatorManager.js +48 -44
- package/dist/esm/src/progressListener.js +16 -12
- package/dist/esm/src/providerManager.d.ts +2 -1
- package/dist/esm/src/providerManager.js +43 -29
- 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.d.ts +2 -2
- package/dist/esm/src/repositoryManager.js +33 -28
- 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 +60 -55
- 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 +7 -2
- package/package.json +10 -4
- package/src/assetManager.ts +18 -16
- package/src/assets/routes.ts +2 -2
- package/src/authManager.ts +62 -0
- package/src/codeGeneratorManager.ts +3 -3
- package/src/configManager.ts +2 -2
- package/src/definitionsManager.ts +132 -17
- package/src/instanceManager.ts +5 -5
- package/src/instances/routes.ts +2 -2
- package/src/operatorManager.ts +7 -12
- package/src/providerManager.ts +27 -19
- package/src/repositoryManager.ts +8 -11
- package/src/socketManager.ts +6 -0
- package/src/utils/BlockInstanceRunner.ts +6 -8
- package/src/utils/DefaultProviderInstaller.ts +141 -0
- package/tsconfig.json +3 -2
package/src/repositoryManager.ts
CHANGED
@@ -58,19 +58,19 @@ class RepositoryManager {
|
|
58
58
|
return this.watcher.clearSourceOfChangeFor(file);
|
59
59
|
}
|
60
60
|
|
61
|
-
public ensureDefaultProviders(): void {
|
61
|
+
public async ensureDefaultProviders(): Promise<void> {
|
62
62
|
socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_START, { providers: DEFAULT_PROVIDERS });
|
63
|
-
const tasks = this.
|
63
|
+
const tasks = await this.scheduleInstallation(DEFAULT_PROVIDERS);
|
64
64
|
Promise.allSettled(tasks.map((t) => t.wait())).then(() => {
|
65
65
|
socketManager.emitGlobal(EVENT_DEFAULT_PROVIDERS_END, {});
|
66
66
|
});
|
67
67
|
}
|
68
68
|
|
69
|
-
private
|
69
|
+
private async scheduleInstallation(refs: string[]): Promise<Task[]> {
|
70
70
|
//We make sure to only install one asset at a time - otherwise unexpected things might happen
|
71
71
|
const createInstaller = (ref: string) => {
|
72
72
|
return async () => {
|
73
|
-
if (definitionsManager.exists(ref)) {
|
73
|
+
if (await definitionsManager.exists(ref)) {
|
74
74
|
return;
|
75
75
|
}
|
76
76
|
//console.log(`Installing asset: ${ref}`);
|
@@ -97,7 +97,7 @@ class RepositoryManager {
|
|
97
97
|
}
|
98
98
|
ref = normalizeKapetaUri(ref);
|
99
99
|
|
100
|
-
if (definitionsManager.exists(ref)) {
|
100
|
+
if (await definitionsManager.exists(ref)) {
|
101
101
|
continue;
|
102
102
|
}
|
103
103
|
|
@@ -126,10 +126,7 @@ class RepositoryManager {
|
|
126
126
|
return;
|
127
127
|
}
|
128
128
|
|
129
|
-
const
|
130
|
-
const installedAsset = definitions.find(
|
131
|
-
(d) => d.definition.metadata.name === fullName && d.version === version
|
132
|
-
);
|
129
|
+
const installedAsset = await definitionsManager.getDefinition(`${fullName}:${version}`);
|
133
130
|
|
134
131
|
let assetVersion;
|
135
132
|
try {
|
@@ -147,12 +144,12 @@ class RepositoryManager {
|
|
147
144
|
|
148
145
|
let tasks: Task[] | undefined = undefined;
|
149
146
|
if (!installedAsset) {
|
150
|
-
tasks = this.
|
147
|
+
tasks = await this.scheduleInstallation([ref]);
|
151
148
|
} else {
|
152
149
|
//Ensure dependencies are installed
|
153
150
|
const refs = assetVersion.dependencies.map((dep: Dependency) => dep.name);
|
154
151
|
if (refs.length > 0) {
|
155
|
-
tasks = this.
|
152
|
+
tasks = await this.scheduleInstallation(refs);
|
156
153
|
}
|
157
154
|
}
|
158
155
|
|
package/src/socketManager.ts
CHANGED
@@ -37,10 +37,16 @@ export class SocketManager {
|
|
37
37
|
}
|
38
38
|
|
39
39
|
emit(context: string, type: string, payload: any) {
|
40
|
+
if (!this._io) {
|
41
|
+
return;
|
42
|
+
}
|
40
43
|
this.io.to(context).emit(type, { context, payload });
|
41
44
|
}
|
42
45
|
|
43
46
|
emitGlobal(type: string, payload: any) {
|
47
|
+
if (!this._io) {
|
48
|
+
return;
|
49
|
+
}
|
44
50
|
this.io.emit(type, payload);
|
45
51
|
}
|
46
52
|
|
@@ -25,8 +25,9 @@ const DOCKER_ENV_VARS = [
|
|
25
25
|
`KAPETA_ENVIRONMENT_TYPE=docker`,
|
26
26
|
];
|
27
27
|
|
28
|
-
function getProvider(uri: KapetaURI) {
|
29
|
-
|
28
|
+
async function getProvider(uri: KapetaURI) {
|
29
|
+
const providers = await definitionsManager.getProviderDefinitions();
|
30
|
+
return providers.find((provider) => {
|
30
31
|
const ref = `${provider.definition.metadata.name}:${provider.version}`;
|
31
32
|
return parseKapetaUri(ref).id === uri.id;
|
32
33
|
});
|
@@ -87,10 +88,7 @@ export class BlockInstanceRunner {
|
|
87
88
|
blockUri.version = 'local';
|
88
89
|
}
|
89
90
|
|
90
|
-
const assetVersion = definitionsManager.
|
91
|
-
const ref = `${definitions.definition.metadata.name}:${definitions.version}`;
|
92
|
-
return parseKapetaUri(ref).id === blockUri.id;
|
93
|
-
});
|
91
|
+
const assetVersion = await definitionsManager.getDefinition(blockUri.id);
|
94
92
|
|
95
93
|
if (!assetVersion) {
|
96
94
|
throw new Error(`Block definition not found: ${blockUri.id}`);
|
@@ -98,7 +96,7 @@ export class BlockInstanceRunner {
|
|
98
96
|
|
99
97
|
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
100
98
|
|
101
|
-
const providerVersion = getProvider(kindUri);
|
99
|
+
const providerVersion = await getProvider(kindUri);
|
102
100
|
|
103
101
|
if (!providerVersion) {
|
104
102
|
throw new Error(`Kind not found: ${kindUri.id}`);
|
@@ -150,7 +148,7 @@ export class BlockInstanceRunner {
|
|
150
148
|
|
151
149
|
const kindUri = parseKapetaUri(assetVersion.definition.spec?.target?.kind);
|
152
150
|
|
153
|
-
const targetVersion = getProvider(kindUri);
|
151
|
+
const targetVersion = await getProvider(kindUri);
|
154
152
|
|
155
153
|
if (!targetVersion) {
|
156
154
|
throw new Error(`Target not found: ${kindUri.id}`);
|
@@ -0,0 +1,141 @@
|
|
1
|
+
import Path from 'node:path';
|
2
|
+
import OS from 'node:os';
|
3
|
+
import ClusterConfiguration from '@kapeta/local-cluster-config';
|
4
|
+
import FS from 'fs-extra';
|
5
|
+
import request from 'request';
|
6
|
+
import { extract } from 'tar-stream';
|
7
|
+
import gunzip from 'gunzip-maybe';
|
8
|
+
import { filesystemManager } from '../filesystemManager';
|
9
|
+
import { Actions } from '@kapeta/nodejs-registry-utils';
|
10
|
+
import { ProgressListener } from '../progressListener';
|
11
|
+
import { glob } from 'glob';
|
12
|
+
|
13
|
+
const DEFAULT_PROVIDERS_URL = 'https://storage.googleapis.com/kapeta-production-cdn/archives/default-providers.tar.gz';
|
14
|
+
const DEFAULT_PROJECT_HOME_DIR = 'KapetaProjects';
|
15
|
+
|
16
|
+
const ARCHIVE_LOCAL_PREFIX = 'local';
|
17
|
+
|
18
|
+
class DefaultProviderInstaller {
|
19
|
+
private readonly progressListener = new ProgressListener();
|
20
|
+
|
21
|
+
public async checkForDefault() {
|
22
|
+
const definitions = ClusterConfiguration.getDefinitions();
|
23
|
+
if (definitions.length < 1) {
|
24
|
+
console.log('Installing default providers');
|
25
|
+
try {
|
26
|
+
await this.install();
|
27
|
+
} catch (e) {
|
28
|
+
console.warn('Failed to install defaults', e);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
private async install() {
|
34
|
+
await this.download();
|
35
|
+
await this.linkLocal();
|
36
|
+
}
|
37
|
+
|
38
|
+
private async linkLocal() {
|
39
|
+
const projectBase = await this.ensureDefaultProjectHome();
|
40
|
+
const folders = this.scanProjectBase(projectBase);
|
41
|
+
for (let folder of folders) {
|
42
|
+
console.log('Linking %s', folder);
|
43
|
+
await Actions.link(this.progressListener, folder);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
private scanProjectBase(projectBase: string) {
|
48
|
+
const assetFiles = glob.sync('*/**/kapeta.yml', { cwd: projectBase });
|
49
|
+
return assetFiles.map((assetFile) => {
|
50
|
+
return Path.dirname(Path.join(projectBase, assetFile));
|
51
|
+
});
|
52
|
+
}
|
53
|
+
|
54
|
+
private async ensureDefaultProjectHome(): Promise<string> {
|
55
|
+
const defaultProjectHome = Path.join(OS.homedir(), DEFAULT_PROJECT_HOME_DIR);
|
56
|
+
let projectBase = filesystemManager.getProjectRootFolder();
|
57
|
+
|
58
|
+
if (!projectBase) {
|
59
|
+
filesystemManager.setProjectRootFolder(defaultProjectHome);
|
60
|
+
projectBase = defaultProjectHome;
|
61
|
+
if (!(await FS.pathExists(projectBase))) {
|
62
|
+
await FS.mkdirp(projectBase);
|
63
|
+
}
|
64
|
+
}
|
65
|
+
return projectBase;
|
66
|
+
}
|
67
|
+
|
68
|
+
private async download() {
|
69
|
+
const projectBase: string = await this.ensureDefaultProjectHome();
|
70
|
+
const repoBase: string = ClusterConfiguration.getRepositoryBasedir();
|
71
|
+
|
72
|
+
return new Promise<void>((resolve, reject) => {
|
73
|
+
const extractor = extract();
|
74
|
+
const dirCache = new Set<string>();
|
75
|
+
extractor.on('entry', async function (header, stream, next) {
|
76
|
+
if (header.type !== 'file') {
|
77
|
+
stream.on('end', function () {
|
78
|
+
next(); // ready for next entry
|
79
|
+
});
|
80
|
+
stream.resume(); // just auto drain the stream
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
|
84
|
+
// Local (editable) assets should be stored in the project folder
|
85
|
+
// - installed assets goes into the repository folder
|
86
|
+
const baseDir: string = header.name.startsWith(ARCHIVE_LOCAL_PREFIX) ? projectBase : repoBase;
|
87
|
+
|
88
|
+
const parts = header.name.split(/\//g);
|
89
|
+
parts.shift();
|
90
|
+
const filename = parts.join(Path.sep);
|
91
|
+
|
92
|
+
try {
|
93
|
+
const dirname = Path.join(baseDir, Path.dirname(filename));
|
94
|
+
if (!dirCache.has(dirname)) {
|
95
|
+
let dirExists = false;
|
96
|
+
try {
|
97
|
+
await FS.stat(dirname);
|
98
|
+
dirExists = true;
|
99
|
+
} catch (e) {}
|
100
|
+
if (!dirExists) {
|
101
|
+
await FS.mkdirp(dirname);
|
102
|
+
}
|
103
|
+
dirCache.add(dirname);
|
104
|
+
}
|
105
|
+
const fileTarget = Path.join(baseDir, filename);
|
106
|
+
stream.on('error', (err) => {
|
107
|
+
reject(err);
|
108
|
+
});
|
109
|
+
stream.on('end', next);
|
110
|
+
|
111
|
+
stream.pipe(
|
112
|
+
FS.createWriteStream(fileTarget, {
|
113
|
+
mode: header.mode,
|
114
|
+
})
|
115
|
+
);
|
116
|
+
} catch (e) {
|
117
|
+
reject(e);
|
118
|
+
}
|
119
|
+
});
|
120
|
+
|
121
|
+
extractor.on('finish', function () {
|
122
|
+
// all entries done - lets finalize it
|
123
|
+
console.log('Default providers installed');
|
124
|
+
resolve();
|
125
|
+
});
|
126
|
+
|
127
|
+
extractor.on('error', function (err) {
|
128
|
+
reject(err);
|
129
|
+
});
|
130
|
+
|
131
|
+
console.log('Downloading default providers from %s', DEFAULT_PROVIDERS_URL);
|
132
|
+
const response = request(DEFAULT_PROVIDERS_URL);
|
133
|
+
response.on('error', function (err) {
|
134
|
+
reject(err);
|
135
|
+
});
|
136
|
+
response.pipe(gunzip()).pipe(extractor);
|
137
|
+
});
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
export const defaultProviderInstaller = new DefaultProviderInstaller();
|
package/tsconfig.json
CHANGED