Skip to content

Commit 10ef23f

Browse files
committed
fix: Finally found a fix to the memory issues. It was because of backpressure from too many updates due to the spinner updating on every log. Updated UI with new codify ink-form version
1 parent 240c210 commit 10ef23f

File tree

6 files changed

+32
-20
lines changed

6 files changed

+32
-20
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"codify": "./bin/run.js"
55
},
66
"dependencies": {
7-
"@codifycli/ink-form": "0.0.10",
7+
"@codifycli/ink-form": "0.0.11",
88
"ink-select-input": "^6.0.0",
99
"@homebridge/node-pty-prebuilt-multiarch": "^0.12.0-beta.5",
1010
"@inkjs/ui": "^2",

src/orchestrators/import.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,9 @@ export class ImportOrchestrator {
122122
const importedConfigs: ResourceConfig[] = [];
123123
const errors: string[] = [];
124124

125+
ctx.subprocessStarted(SubProcessName.IMPORT_RESOURCE);
126+
125127
await Promise.all(resources.map(async (resource) => {
126-
ctx.subprocessStarted(SubProcessName.IMPORT_RESOURCE, resource.type);
127128

128129
try {
129130
const response = await pluginManager.importResource(resource.toJson());
@@ -143,9 +144,10 @@ export class ImportOrchestrator {
143144
errors.push(error.message ?? error);
144145
}
145146

146-
ctx.subprocessFinished(SubProcessName.IMPORT_RESOURCE, resource.type);
147147
}))
148148

149+
ctx.subprocessFinished(SubProcessName.IMPORT_RESOURCE);
150+
149151
return {
150152
result: importedConfigs,
151153
errors,
@@ -186,17 +188,13 @@ ${JSON.stringify(unsupportedTypeIds)}`);
186188
}
187189

188190
private static async validate(typeIds: string[], project: Project, pluginManager: PluginManager, dependencyMap: DependencyMap): Promise<void> {
189-
ctx.subprocessStarted(SubProcessName.VALIDATE)
190-
191191
project.validateTypeIds(dependencyMap);
192192

193193
const unsupportedTypeIds = typeIds.filter((type) => !dependencyMap.has(type));
194194
if (unsupportedTypeIds.length > 0) {
195195
throw new Error(`The following resources cannot be imported. No plugins found that support the following types:
196196
${JSON.stringify(unsupportedTypeIds)}`);
197197
}
198-
199-
ctx.subprocessFinished(SubProcessName.VALIDATE)
200198
}
201199

202200
private static async getImportParameters(reporter: Reporter, project: Project, resourceInfoList: ResourceInfo[]): Promise<Array<ResourceConfig>> {

src/ui/components/default-component.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import chalk from 'chalk';
44
import { Box, Static, Text } from 'ink';
55
import SelectInput from 'ink-select-input';
66
import { useAtom } from 'jotai';
7+
import { selectAtom } from 'jotai/utils';
78
import { EventEmitter } from 'node:events';
89
import React, { useLayoutEffect, useState } from 'react';
910

@@ -26,12 +27,16 @@ export function DefaultComponent(props: {
2627
const { emitter } = props
2728
const [disableSudoPrompt, setDisableSudoPrompt] = useState(false);
2829
const [{ status: renderStatus, data: renderData }] = useAtom(store.renderState);
30+
const logTriggeredSpinner = selectAtom(store.progressState, (progress) => progress?.logTriggeredSpinner ?? false);
2931

3032
// Use layoutEffect runs before the first render, whereas useEffect runs after
3133
useLayoutEffect(() => {
3234
const logListener = (log: string) => {
3335
console.log(chalk.cyan(log));
34-
spinnerEmitter.emit('data');
36+
37+
if (logTriggeredSpinner) {
38+
spinnerEmitter.emit('data');
39+
}
3540
};
3641

3742
emitter.on(RenderEvent.LOG, logListener);

src/ui/components/progress/progress-display.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { StatusMessage } from '@inkjs/ui';
1+
import { StatusMessage, Spinner as AutomatedSpinner } from '@inkjs/ui';
22
import { Box } from 'ink';
33
import EventEmitter from 'node:events';
44
import React from 'react';
@@ -16,6 +16,7 @@ export interface ProgressState {
1616
name: string,
1717
label: string;
1818
status: ProgressStatus;
19+
logTriggeredSpinner: boolean;
1920
subProgresses: Array<{
2021
name: string,
2122
label: string;
@@ -35,22 +36,26 @@ export function ProgressDisplay(
3536
return;
3637
}
3738

38-
const { label, status, subProgresses } = progress;
39+
const { label, status, subProgresses, logTriggeredSpinner } = progress;
3940

4041
return <Box flexDirection="column">
4142
{
4243
status === ProgressStatus.IN_PROGRESS
43-
? <Spinner type="circleHalves" eventEmitter={props.emitter} eventType={props.eventType} label={label}/>
44+
? (logTriggeredSpinner
45+
? <Spinner eventEmitter={props.emitter} eventType={props.eventType} label={label} type="circleHalves"/>
46+
: <AutomatedSpinner label={label} type="circleHalves" />
47+
)
4448
: <StatusMessage variant="success">{label}</StatusMessage>
4549
}
4650
<Box flexDirection="column" marginLeft={2}>
47-
<SubProgressDisplay emitter={props.emitter} eventType={props.eventType} subProgresses={subProgresses}/>
51+
<SubProgressDisplay emitter={props.emitter} eventType={props.eventType} subProgresses={subProgresses} logTriggeredSpinner={logTriggeredSpinner}/>
4852
</Box>
4953
</Box>
5054
}
5155

5256
export function SubProgressDisplay(
5357
props: {
58+
logTriggeredSpinner: boolean;
5459
subProgresses: ProgressState['subProgresses'],
5560
emitter: EventEmitter,
5661
eventType: string,
@@ -66,7 +71,10 @@ export function SubProgressDisplay(
6671
.slice(Math.max(0, subProgresses.length - 5), subProgresses.length)
6772
.map((s, idx) =>
6873
s.status === ProgressStatus.IN_PROGRESS
69-
? <Spinner eventEmitter={emitter} eventType={eventType} key={idx} label={s.label} type="circleHalves"/>
74+
? (props.logTriggeredSpinner
75+
? <Spinner eventEmitter={emitter} eventType={eventType} key={idx} label={s.label} type="circleHalves"/>
76+
: <AutomatedSpinner key={idx} label={s.label} type="circleHalves" />
77+
)
7078
: <StatusMessage key={idx} variant="success">{s.label}</StatusMessage>
7179
)
7280
}</>

src/ui/reporters/default-reporter.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import React from 'react';
88
import { Plan } from '../../entities/plan.js';
99
import { ResourceConfig } from '../../entities/resource-config.js';
1010
import { ResourceInfo } from '../../entities/resource-info.js';
11-
import { Event, ProcessName, SubProcessName, ctx } from '../../events/context.js';
11+
import { ctx, Event, ProcessName, SubProcessName } from '../../events/context.js';
1212
import { ImportResult } from '../../orchestrators/import.js';
1313
import { FileModificationResult } from '../../utils/file-modification-calculator.js';
1414
import { SudoUtils } from '../../utils/sudo.js';
@@ -192,6 +192,7 @@ export class DefaultReporter implements Reporter {
192192
name,
193193
status: ProgressStatus.IN_PROGRESS,
194194
subProgresses: [],
195+
logTriggeredSpinner: name === ProcessName.APPLY || name === ProcessName.DESTROY,
195196
};
196197

197198
this.log(`${label} started`)
@@ -212,7 +213,7 @@ export class DefaultReporter implements Reporter {
212213

213214
this.progressState?.subProgresses?.push({
214215
label,
215-
name: name + additionalName,
216+
name: name + (additionalName ?? ''),
216217
status: ProgressStatus.IN_PROGRESS,
217218
});
218219
store.set(store.progressState, structuredClone(this.progressState));
@@ -223,7 +224,7 @@ export class DefaultReporter implements Reporter {
223224

224225
const subProgress = this.progressState
225226
?.subProgresses
226-
?.find((p) => p.name === name + additionalName);
227+
?.find((p) => p.name === name + (additionalName ?? ''));
227228

228229
if (!subProgress) {
229230
return;

0 commit comments

Comments
 (0)