@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
@@ -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._install(DEFAULT_PROVIDERS);
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 _install(refs: string[]): Task[] {
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 definitions = definitionsManager.getDefinitions();
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._install([ref]);
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._install(refs);
152
+ tasks = await this.scheduleInstallation(refs);
156
153
  }
157
154
  }
158
155
 
@@ -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
- return definitionsManager.getProviderDefinitions().find((provider) => {
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.getDefinitions().find((definitions) => {
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
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "extends": "@tsconfig/node18/tsconfig.json",
3
3
  "compilerOptions": {
4
+ "module": "node16",
5
+ "moduleResolution": "node16",
4
6
  "outDir": "./dist",
5
- "declaration": true,
6
- "esModuleInterop": true
7
+ "declaration": true
7
8
  },
8
9
  "ts-node": {
9
10
  "files": true