Skip to content

Commit

Permalink
refactor(chatView): Enhance chatView by avoiding webview destruction …
Browse files Browse the repository at this point in the history
…and boosting operation speed (#70)

* refactor(chatView): Enhance chatView by avoiding webview destruction and boosting operation speed

* Optimize chatView request: Switch from loop waiting to waiting for chatView onLoad
  • Loading branch information
meteor199 authored Jul 16, 2024
1 parent c0c97ef commit 053680a
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 8 deletions.
32 changes: 32 additions & 0 deletions src/base/common/defer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
interface Deferred<T> {
abort: () => void;
resolve: (value: T) => void;
reject: (reason?: unknown) => void;
promise: Promise<T>;
}

export function defer<T>(signal?: AbortSignal): Deferred<T> {
const ac = new AbortController();
const dtd = {} as Deferred<T>;

dtd.promise = new Promise((resolve, reject) => {
dtd.resolve = resolve;
dtd.reject = reject;
});

function onDidAbort() {
dtd.reject(new Error('user aborted'));
}

ac.signal.addEventListener('abort', onDidAbort);

if (signal) {
signal.addEventListener('abort', onDidAbort);
}

dtd.abort = function () {
ac.abort();
};

return dtd;
}
6 changes: 0 additions & 6 deletions src/commands/commandsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,6 @@ export class CommandsService {
return;
}

// TODO hack message render empty
await setTimeout(800);

const selection = editor.selection;
if (selection.isEmpty) {
Expand Down Expand Up @@ -124,8 +122,6 @@ export class CommandsService {

await chat.show();

// TODO hack message render empty
await setTimeout(800);
await addHighlightedCodeToContext(editor, selection, chat);

await setTimeout(800);
Expand All @@ -147,8 +143,6 @@ export class CommandsService {

await chat.show();

// TODO hack message render empty
await setTimeout(600);
await addHighlightedCodeToContext(editor, selection, chat);

await setTimeout(800);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/commandsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export async function addHighlightedCodeToContext(editor: TextEditor, selection:
},
};

await chat.send('highlightedCode', {
await chat.request('highlightedCode', {
rangeInFileWithContents,
});
}
7 changes: 6 additions & 1 deletion src/editor/views/chat/chatViewService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ export class ChatViewService {
return this.continueViewProvider.send(type, message);
}

request(type: string, message?: unknown) {
return this.continueViewProvider.request(type, message);
}
postMessage(message: unknown) {
return this.continueViewProvider.postMessage(message);
}
Expand All @@ -46,6 +49,8 @@ export class ChatViewService {
}

register() {
return window.registerWebviewViewProvider(CHAT_VIEW_ID, this.continueViewProvider);
return window.registerWebviewViewProvider(CHAT_VIEW_ID, this.continueViewProvider, {
webviewOptions: { retainContextWhenHidden: true },
});
}
}
6 changes: 6 additions & 0 deletions src/editor/views/chat/continue/continueMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,9 @@ export class ContinueEvent<
});
}
}

export interface Message<T = any> {
messageType: string;
messageId: string;
data: T;
}
32 changes: 32 additions & 0 deletions src/editor/views/chat/continue/continueViewProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {

import { CMD_CODEASPACE_ANALYSIS, CMD_CODEASPACE_KEYWORDS_ANALYSIS } from 'base/common/configuration/configuration';
import { ConfigurationService } from 'base/common/configuration/configurationService';
import { defer } from 'base/common/defer';
import { ChatMessageRole, type IChatMessage } from 'base/common/language-models/languageModels';
import { LanguageModelsService } from 'base/common/language-models/languageModelsService';
import { logger } from 'base/common/log/log';
Expand All @@ -33,13 +34,15 @@ import {
type FromWebviewMessage,
type IChatMessageParam,
IChatModelResource,
Message,
PersistedSessionInfo,
SessionInfo,
type ShowErrorMessage,
} from './continueMessages';

export class ContinueViewProvider extends AbstractWebviewViewProvider implements WebviewViewProvider {
private historySaveDir = path.join(os.homedir(), '.autodev/sessions');
private _readyDefer = defer<void>();

constructor(
private context: ExtensionContext,
Expand All @@ -48,6 +51,7 @@ export class ContinueViewProvider extends AbstractWebviewViewProvider implements
) {
super(context);

logger.debug('ContinueViewProvider init');
// TODO disposable
configService.onDidChange(event => {
if (event.affectsConfiguration('autodev.chat.models')) {
Expand All @@ -59,6 +63,10 @@ export class ContinueViewProvider extends AbstractWebviewViewProvider implements
});
}

ready() {
return this._readyDefer.promise;
}

newSession(prompt?: string) {
if (prompt) {
this.send('newSessionWithPrompt', { prompt });
Expand All @@ -79,6 +87,28 @@ export class ContinueViewProvider extends AbstractWebviewViewProvider implements
});
}

async request(type: string, data?: unknown): Promise<boolean> {
const messageId = randomUUID();

await this.ready();

return new Promise((resolve, reject) => {
const disposable = this._webview!.onDidReceiveMessage((msg: Message) => {
if (msg.messageId === messageId) {
logger.debug(`message received, messageID: ${messageId}`);
resolve(msg.data);
disposable?.dispose();
}
});
this.postMessage({
messageId: messageId,
messageType: type,
data: data,
});
logger.debug(`send success, messageType:${type},messageID:${messageId}`);
});
}

async provideWebviewView(webviewView: WebviewView): Promise<void> {
const webview = webviewView.webview;
const extensionUri = this.context.extensionUri;
Expand Down Expand Up @@ -130,6 +160,7 @@ export class ContinueViewProvider extends AbstractWebviewViewProvider implements

switch (payload.messageType) {
case 'onLoad':
logger.debug('sidebar webview onLoad ');
this.handleViewLoad(new ContinueEvent(webview, payload));
break;

Expand Down Expand Up @@ -209,6 +240,7 @@ export class ContinueViewProvider extends AbstractWebviewViewProvider implements
vscMachineId: '1111',
vscMediaUrl: '',
});
this._readyDefer.resolve();
}

private handleGetOpenFiles(event: ContinueEvent<'getOpenFiles'>) {
Expand Down

0 comments on commit 053680a

Please sign in to comment.