@kapeta/local-cluster-service 0.54.10 → 0.54.12
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 +14 -0
- package/dist/cjs/src/storm/event-parser.js +9 -3
- package/dist/cjs/src/storm/routes.js +21 -13
- package/dist/esm/src/storm/event-parser.js +9 -3
- package/dist/esm/src/storm/routes.js +21 -13
- package/package.json +1 -1
- package/src/storm/event-parser.ts +10 -4
- package/src/storm/routes.ts +23 -16
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## [0.54.12](https://github.com/kapetacom/local-cluster-service/compare/v0.54.11...v0.54.12) (2024-07-10)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* throttle plan events and catch event errors ([#190](https://github.com/kapetacom/local-cluster-service/issues/190)) ([9a04b1e](https://github.com/kapetacom/local-cluster-service/commit/9a04b1eefba7f94558c1fd08441584dace9ae7e9))
|
7
|
+
|
8
|
+
## [0.54.11](https://github.com/kapetacom/local-cluster-service/compare/v0.54.10...v0.54.11) (2024-07-10)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* handle unpredictable AI outputs ([#189](https://github.com/kapetacom/local-cluster-service/issues/189)) ([651c1dc](https://github.com/kapetacom/local-cluster-service/commit/651c1dc1c15e5392fc4f4b09f27ce42e4f7ae7a5))
|
14
|
+
|
1
15
|
## [0.54.10](https://github.com/kapetacom/local-cluster-service/compare/v0.54.9...v0.54.10) (2024-07-09)
|
2
16
|
|
3
17
|
|
@@ -386,12 +386,12 @@ class StormEventParser {
|
|
386
386
|
const blockSpec = blockDefinitionInfo.content.spec;
|
387
387
|
const apiResources = {};
|
388
388
|
let dbResource = undefined;
|
389
|
-
blockInfo.resources.forEach((resource) => {
|
389
|
+
(blockInfo.resources || []).forEach((resource) => {
|
390
390
|
const port = {
|
391
391
|
type: this.toPortType(resource.type),
|
392
392
|
};
|
393
393
|
switch (resource.type) {
|
394
|
-
case 'API':
|
394
|
+
case 'API': {
|
395
395
|
const apiResource = {
|
396
396
|
kind: this.toResourceKind(resource.type),
|
397
397
|
metadata: {
|
@@ -411,6 +411,7 @@ class StormEventParser {
|
|
411
411
|
apiResources[resource.name] = apiResource;
|
412
412
|
blockSpec.providers.push(apiResource);
|
413
413
|
break;
|
414
|
+
}
|
414
415
|
case 'CLIENT':
|
415
416
|
blockSpec.consumers.push({
|
416
417
|
kind: this.toResourceKind(resource.type),
|
@@ -508,7 +509,12 @@ class StormEventParser {
|
|
508
509
|
// available rest resource
|
509
510
|
const firstKey = Object.keys(apiResources)[0];
|
510
511
|
const firstEntry = apiResources[firstKey];
|
511
|
-
firstEntry
|
512
|
+
if (firstEntry) {
|
513
|
+
firstEntry.spec.source.value += api + '\n\n';
|
514
|
+
}
|
515
|
+
else {
|
516
|
+
console.warn('Unable to find resource for API', api);
|
517
|
+
}
|
512
518
|
}
|
513
519
|
});
|
514
520
|
blockInfo.types.forEach((type) => {
|
@@ -17,6 +17,7 @@ const event_parser_1 = require("./event-parser");
|
|
17
17
|
const codegen_1 = require("./codegen");
|
18
18
|
const assetManager_1 = require("../assetManager");
|
19
19
|
const path_1 = __importDefault(require("path"));
|
20
|
+
const lodash_1 = __importDefault(require("lodash"));
|
20
21
|
const router = (0, express_promise_router_1.default)();
|
21
22
|
router.use('/', cors_1.corsHandler);
|
22
23
|
router.use('/', stringBody_1.stringBody);
|
@@ -35,21 +36,28 @@ router.post('/:handle/all', async (req, res) => {
|
|
35
36
|
res.set('Access-Control-Expose-Headers', stormClient_1.ConversationIdHeader);
|
36
37
|
res.set(stormClient_1.ConversationIdHeader, metaStream.getConversationId());
|
37
38
|
let currentPhase = events_1.StormEventPhaseType.META;
|
39
|
+
// Helper to avoid sending the plan multiple times in a row
|
40
|
+
const sendUpdatedPlan = lodash_1.default.debounce(sendDefinitions, 50, { maxWait: 200 });
|
38
41
|
metaStream.on('data', (data) => {
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
try {
|
43
|
+
const result = eventParser.processEvent(handle, data);
|
44
|
+
switch (data.type) {
|
45
|
+
case 'CREATE_API':
|
46
|
+
case 'CREATE_MODEL':
|
47
|
+
case 'CREATE_TYPE':
|
48
|
+
if (currentPhase !== events_1.StormEventPhaseType.DEFINITIONS) {
|
49
|
+
sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.META));
|
50
|
+
currentPhase = events_1.StormEventPhaseType.DEFINITIONS;
|
51
|
+
sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.DEFINITIONS));
|
52
|
+
}
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
sendEvent(res, data);
|
56
|
+
sendUpdatedPlan(res, result);
|
57
|
+
}
|
58
|
+
catch (e) {
|
59
|
+
console.error('Failed to process event', e);
|
50
60
|
}
|
51
|
-
sendEvent(res, data);
|
52
|
-
sendDefinitions(res, result);
|
53
61
|
});
|
54
62
|
try {
|
55
63
|
sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.META));
|
@@ -386,12 +386,12 @@ class StormEventParser {
|
|
386
386
|
const blockSpec = blockDefinitionInfo.content.spec;
|
387
387
|
const apiResources = {};
|
388
388
|
let dbResource = undefined;
|
389
|
-
blockInfo.resources.forEach((resource) => {
|
389
|
+
(blockInfo.resources || []).forEach((resource) => {
|
390
390
|
const port = {
|
391
391
|
type: this.toPortType(resource.type),
|
392
392
|
};
|
393
393
|
switch (resource.type) {
|
394
|
-
case 'API':
|
394
|
+
case 'API': {
|
395
395
|
const apiResource = {
|
396
396
|
kind: this.toResourceKind(resource.type),
|
397
397
|
metadata: {
|
@@ -411,6 +411,7 @@ class StormEventParser {
|
|
411
411
|
apiResources[resource.name] = apiResource;
|
412
412
|
blockSpec.providers.push(apiResource);
|
413
413
|
break;
|
414
|
+
}
|
414
415
|
case 'CLIENT':
|
415
416
|
blockSpec.consumers.push({
|
416
417
|
kind: this.toResourceKind(resource.type),
|
@@ -508,7 +509,12 @@ class StormEventParser {
|
|
508
509
|
// available rest resource
|
509
510
|
const firstKey = Object.keys(apiResources)[0];
|
510
511
|
const firstEntry = apiResources[firstKey];
|
511
|
-
firstEntry
|
512
|
+
if (firstEntry) {
|
513
|
+
firstEntry.spec.source.value += api + '\n\n';
|
514
|
+
}
|
515
|
+
else {
|
516
|
+
console.warn('Unable to find resource for API', api);
|
517
|
+
}
|
512
518
|
}
|
513
519
|
});
|
514
520
|
blockInfo.types.forEach((type) => {
|
@@ -17,6 +17,7 @@ const event_parser_1 = require("./event-parser");
|
|
17
17
|
const codegen_1 = require("./codegen");
|
18
18
|
const assetManager_1 = require("../assetManager");
|
19
19
|
const path_1 = __importDefault(require("path"));
|
20
|
+
const lodash_1 = __importDefault(require("lodash"));
|
20
21
|
const router = (0, express_promise_router_1.default)();
|
21
22
|
router.use('/', cors_1.corsHandler);
|
22
23
|
router.use('/', stringBody_1.stringBody);
|
@@ -35,21 +36,28 @@ router.post('/:handle/all', async (req, res) => {
|
|
35
36
|
res.set('Access-Control-Expose-Headers', stormClient_1.ConversationIdHeader);
|
36
37
|
res.set(stormClient_1.ConversationIdHeader, metaStream.getConversationId());
|
37
38
|
let currentPhase = events_1.StormEventPhaseType.META;
|
39
|
+
// Helper to avoid sending the plan multiple times in a row
|
40
|
+
const sendUpdatedPlan = lodash_1.default.debounce(sendDefinitions, 50, { maxWait: 200 });
|
38
41
|
metaStream.on('data', (data) => {
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
try {
|
43
|
+
const result = eventParser.processEvent(handle, data);
|
44
|
+
switch (data.type) {
|
45
|
+
case 'CREATE_API':
|
46
|
+
case 'CREATE_MODEL':
|
47
|
+
case 'CREATE_TYPE':
|
48
|
+
if (currentPhase !== events_1.StormEventPhaseType.DEFINITIONS) {
|
49
|
+
sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.META));
|
50
|
+
currentPhase = events_1.StormEventPhaseType.DEFINITIONS;
|
51
|
+
sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.DEFINITIONS));
|
52
|
+
}
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
sendEvent(res, data);
|
56
|
+
sendUpdatedPlan(res, result);
|
57
|
+
}
|
58
|
+
catch (e) {
|
59
|
+
console.error('Failed to process event', e);
|
50
60
|
}
|
51
|
-
sendEvent(res, data);
|
52
|
-
sendDefinitions(res, result);
|
53
61
|
});
|
54
62
|
try {
|
55
63
|
sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.META));
|
package/package.json
CHANGED
@@ -26,7 +26,8 @@ import {
|
|
26
26
|
DSLAPIParser,
|
27
27
|
DSLController,
|
28
28
|
DSLConverters,
|
29
|
-
DSLDataTypeParser,
|
29
|
+
DSLDataTypeParser,
|
30
|
+
DSLEntityType,
|
30
31
|
DSLMethod,
|
31
32
|
DSLParser,
|
32
33
|
KAPLANG_ID,
|
@@ -540,12 +541,12 @@ export class StormEventParser {
|
|
540
541
|
const apiResources: { [key: string]: Resource | undefined } = {};
|
541
542
|
let dbResource: Resource | undefined = undefined;
|
542
543
|
|
543
|
-
blockInfo.resources.forEach((resource) => {
|
544
|
+
(blockInfo.resources || []).forEach((resource) => {
|
544
545
|
const port = {
|
545
546
|
type: this.toPortType(resource.type),
|
546
547
|
};
|
547
548
|
switch (resource.type) {
|
548
|
-
case 'API':
|
549
|
+
case 'API': {
|
549
550
|
const apiResource = {
|
550
551
|
kind: this.toResourceKind(resource.type),
|
551
552
|
metadata: {
|
@@ -565,6 +566,7 @@ export class StormEventParser {
|
|
565
566
|
apiResources[resource.name] = apiResource;
|
566
567
|
blockSpec.providers!.push(apiResource);
|
567
568
|
break;
|
569
|
+
}
|
568
570
|
case 'CLIENT':
|
569
571
|
blockSpec.consumers!.push({
|
570
572
|
kind: this.toResourceKind(resource.type),
|
@@ -665,7 +667,11 @@ export class StormEventParser {
|
|
665
667
|
// available rest resource
|
666
668
|
const firstKey = Object.keys(apiResources)[0];
|
667
669
|
const firstEntry = apiResources[firstKey];
|
668
|
-
firstEntry
|
670
|
+
if (firstEntry) {
|
671
|
+
firstEntry.spec.source.value += api + '\n\n';
|
672
|
+
} else {
|
673
|
+
console.warn('Unable to find resource for API', api);
|
674
|
+
}
|
669
675
|
}
|
670
676
|
});
|
671
677
|
|
package/src/storm/routes.ts
CHANGED
@@ -22,6 +22,7 @@ import {
|
|
22
22
|
import { StormCodegen } from './codegen';
|
23
23
|
import { assetManager } from '../assetManager';
|
24
24
|
import Path from 'path';
|
25
|
+
import _ from 'lodash';
|
25
26
|
|
26
27
|
const router = Router();
|
27
28
|
|
@@ -29,7 +30,7 @@ router.use('/', corsHandler);
|
|
29
30
|
router.use('/', stringBody);
|
30
31
|
|
31
32
|
router.post('/:handle/all', async (req: KapetaBodyRequest, res: Response) => {
|
32
|
-
const handle = req.params.handle;
|
33
|
+
const handle = req.params.handle as string;
|
33
34
|
|
34
35
|
try {
|
35
36
|
const stormOptions = await resolveOptions();
|
@@ -51,23 +52,29 @@ router.post('/:handle/all', async (req: KapetaBodyRequest, res: Response) => {
|
|
51
52
|
|
52
53
|
let currentPhase = StormEventPhaseType.META;
|
53
54
|
|
55
|
+
// Helper to avoid sending the plan multiple times in a row
|
56
|
+
const sendUpdatedPlan = _.debounce(sendDefinitions, 50, { maxWait: 200 });
|
54
57
|
metaStream.on('data', (data: StormEvent) => {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
58
|
+
try {
|
59
|
+
const result = eventParser.processEvent(handle, data);
|
60
|
+
|
61
|
+
switch (data.type) {
|
62
|
+
case 'CREATE_API':
|
63
|
+
case 'CREATE_MODEL':
|
64
|
+
case 'CREATE_TYPE':
|
65
|
+
if (currentPhase !== StormEventPhaseType.DEFINITIONS) {
|
66
|
+
sendEvent(res, createPhaseEndEvent(StormEventPhaseType.META));
|
67
|
+
currentPhase = StormEventPhaseType.DEFINITIONS;
|
68
|
+
sendEvent(res, createPhaseStartEvent(StormEventPhaseType.DEFINITIONS));
|
69
|
+
}
|
70
|
+
break;
|
71
|
+
}
|
68
72
|
|
69
|
-
|
70
|
-
|
73
|
+
sendEvent(res, data);
|
74
|
+
sendUpdatedPlan(res, result);
|
75
|
+
} catch (e) {
|
76
|
+
console.error('Failed to process event', e);
|
77
|
+
}
|
71
78
|
});
|
72
79
|
|
73
80
|
try {
|