Add stopDevChat function and move spawnAsync to DevChat class

- Import stopDevChat in loadHandlers.ts and register it as a handler
- Move spawnAsync function from devchat.ts to DevChat class as a method
- Add stop method to DevChat class to kill the child process
- Update sendMessage.ts to use a single instance of DevChat
This commit is contained in:
bobo.yang 2023-05-09 14:08:18 +08:00
parent da9883f7f2
commit 95bb1161f1
3 changed files with 46 additions and 31 deletions

View File

@ -6,7 +6,7 @@ import { doCommit } from './doCommit';
import { historyMessages } from './historyMessages';
import { regCommandList } from './regCommandList';
import { regContextList } from './regContextList';
import { sendMessage } from './sendMessage';
import { sendMessage, stopDevChat } from './sendMessage';
import { blockApply } from './showDiff';
import { showDiff } from './showDiff';
import { addConext } from './addContext';
@ -22,6 +22,7 @@ messageHandler.registerHandler('historyMessages', historyMessages);
messageHandler.registerHandler('regCommandList', regCommandList);
messageHandler.registerHandler('regContextList', regContextList);
messageHandler.registerHandler('sendMessage', sendMessage);
messageHandler.registerHandler('stopDevChat', stopDevChat);
messageHandler.registerHandler('block_apply', blockApply);
messageHandler.registerHandler('show_diff', showDiff);
messageHandler.registerHandler('addRefCommandContext', addRefCommandContext);

View File

@ -69,15 +69,13 @@ function getInstructionFiles(): string[] {
return instructionFiles;
}
const devChat = new DevChat();
// message: { command: 'sendMessage', text: 'xxx', parent_hash: 'xxx'}
// return message:
// { command: 'receiveMessage', text: 'xxxx', hash: 'xxx', user: 'xxx', date: 'xxx'}
// { command: 'receiveMessagePartial', text: 'xxxx', user: 'xxx', date: 'xxx'}
export async function sendMessage(message: any, panel: vscode.WebviewPanel): Promise<void> {
const devChat = new DevChat();
const newText2 = await CommandManager.getInstance().processText(message.text);
const parsedMessage = parseMessage(newText2);
const chatOptions: any = {};
@ -110,5 +108,10 @@ export async function sendMessage(message: any, panel: vscode.WebviewPanel): Pro
return;
}
export async function stopDevChat(message: any, panel: vscode.WebviewPanel): Promise<void> {
logger.channel()?.info(`Stopping devchat`);
devChat.stop();
}

View File

@ -9,31 +9,6 @@ import * as fs from 'fs';
import { logger } from '../util/logger';
const spawnAsync = async (command: string, args: string[], options: any, onData: (data: string) => void): Promise<{ code: number, stdout: string; stderr: string }> => {
return new Promise((resolve, reject) => {
const child = spawn(command, args, options);
let stdout = '';
let stderr = '';
child.stdout.on('data', (data) => {
const dataStr = data.toString();
onData(dataStr);
stdout += dataStr;
});
child.stderr.on('data', (data) => {
stderr += data;
});
child.on('close', (code) => {
if (code === 0) {
resolve({ code, stdout, stderr });
} else {
reject({ code, stdout, stderr });
}
});
});
};
const envPath = path.join(__dirname, '..', '.env');
dotenv.config({ path: envPath });
@ -69,6 +44,42 @@ export interface ChatResponse {
class DevChat {
private childProcess: any;
async spawnAsync(command: string, args: string[], options: any, onData: (data: string) => void): Promise<{ code: number, stdout: string; stderr: string }> {
return new Promise((resolve, reject) => {
this.childProcess = spawn(command, args, options);
let stdout = '';
let stderr = '';
this.childProcess.stdout.on('data', (data: { toString: () => any; }) => {
const dataStr = data.toString();
onData(dataStr);
stdout += dataStr;
});
this.childProcess.stderr.on('data', (data: string) => {
stderr += data;
});
this.childProcess.on('close', (code: number) => {
if (code === 0) {
resolve({ code, stdout, stderr });
} else {
reject({ code, stdout, stderr });
}
});
});
};
public stop() {
if (this.childProcess) {
this.childProcess.kill();
this.childProcess = null;
}
}
async chat(content: string, options: ChatOptions = {}, onData: (data: ChatResponse) => void): Promise<ChatResponse> {
let args = ["prompt"];
@ -182,7 +193,7 @@ class DevChat {
};
logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`);
const { code, stdout, stderr } = await spawnAsync('devchat', args, {
const { code, stdout, stderr } = await this.spawnAsync('devchat', args, {
maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB
cwd: workspaceDir,
env: {
@ -230,7 +241,7 @@ class DevChat {
try {
logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`);
const { code, stdout, stderr } = await spawnAsync('devchat', args, {
const { code, stdout, stderr } = await this.spawnAsync('devchat', args, {
maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB
cwd: workspaceDir,
env: {