Не подтверждена Коммит 347baacd создал по автору Daniel Imms's avatar Daniel Imms
Просмотр файлов

Working data stream

владелец 1a7f864b
......@@ -48,6 +48,9 @@ export class MainThreadTerminalShellIntegration extends Disposable implements Ma
this._store.add(commandDetectionEndEvent.event(e => {
this._proxy.$acceptTerminalShellExecutionEnd(e.instance.instanceId, e.data.exitCode);
}));
}
// TODO: This needs to go via the server on remote for performance reasons
// TerminalShellExecution.dataStream
this._store.add(terminalService.onAnyInstanceData(e => this._proxy.$acceptTerminalShellExecutionData(e.instance.instanceId, e.data)));
}
}
......@@ -2269,6 +2269,7 @@ export interface ExtHostTerminalShellIntegrationShape {
$acceptDidChangeShellIntegration(id: number): void;
$acceptTerminalShellExecutionStart(id: number, commandLine: string, cwd: URI | string | undefined): void;
$acceptTerminalShellExecutionEnd(id: number, exitCode: number | undefined): void;
$acceptTerminalShellExecutionData(id: number, data: string): void;
}
export interface ExtHostSCMShape {
......
......@@ -50,8 +50,11 @@ export class ExtHostTerminalShellIntegration extends Disposable implements IExtH
this.onDidChangeTerminalShellIntegration(e => {
console.log('*** onDidChangeTerminalShellIntegration', e);
});
this.onDidStartTerminalShellExecution(e => {
this.onDidStartTerminalShellExecution(async e => {
console.log('*** onDidStartTerminalShellExecution', e);
for await (const d of e.dataStream) {
console.log('data', d);
}
});
this.onDidEndTerminalShellExecution(e => {
console.log('*** onDidEndTerminalShellExecution', e);
......@@ -90,6 +93,10 @@ export class ExtHostTerminalShellIntegration extends Disposable implements IExtH
this._activeShellExecutions.get(id)?.endExecution(exitCode);
this._activeShellExecutions.delete(id);
}
public async $acceptTerminalShellExecutionData(id: number, data: string): Promise<void> {
this._activeShellExecutions.get(id)?.emitData(data);
}
}
class InternalTerminalShellIntegration {
......@@ -138,21 +145,24 @@ class InternalTerminalShellExecution {
get exitCode(): Promise<number | undefined> {
return that._exitCode;
},
get dataStream(): AsyncIterator<string> {
get dataStream(): AsyncIterable<string> {
return that._createDataStream();
}
};
}
private _createDataStream(): AsyncIterator<string> {
private _createDataStream(): AsyncIterable<string> {
// TODO: This must work correctly across multiple extensions
const barrier = this._dataStreamBarrier = new Barrier();
const iterable = new AsyncIterableObject<string>(async emitter => {
this._dataStreamEmitter = emitter;
await barrier.wait();
});
return iterable;
}
return iterable[Symbol.asyncIterator]();
emitData(data: string): void {
this._dataStreamEmitter?.emitOne(data);
}
endExecution(exitCode: number | undefined): void {
......
......@@ -267,6 +267,7 @@ export interface ITerminalService extends ITerminalInstanceHost {
readonly onDidChangeActiveGroup: Event<ITerminalGroup | undefined>;
// Multiplexed events
readonly onAnyInstanceData: Event<{ instance: ITerminalInstance; data: string }>;
readonly onAnyInstanceDataInput: Event<ITerminalInstance>;
readonly onAnyInstanceIconChange: Event<{ instance: ITerminalInstance; userInitiated: boolean }>;
readonly onAnyInstanceMaximumDimensionsChange: Event<ITerminalInstance>;
......
......@@ -154,6 +154,8 @@ export class TerminalService extends Disposable implements ITerminalService {
get onDidChangeActiveGroup(): Event<ITerminalGroup | undefined> { return this._onDidChangeActiveGroup.event; }
// Lazily initialized events that fire when the specified event fires on _any_ terminal
// TODO: Batch events
@memoize get onAnyInstanceData() { return this.createOnInstanceEvent(instance => Event.map(instance.onData, data => ({ instance, data }))); }
@memoize get onAnyInstanceDataInput() { return this.createOnInstanceEvent(e => e.onDidInputData); }
@memoize get onAnyInstanceIconChange() { return this.createOnInstanceEvent(e => e.onIconChanged); }
@memoize get onAnyInstanceMaximumDimensionsChange() { return this.createOnInstanceEvent(e => Event.map(e.onMaximumDimensionsChanged, () => e, e.store)); }
......
......@@ -43,7 +43,7 @@ declare module 'vscode' {
* console.log(data);
* }
*/
dataStream: AsyncIterator<string>;
dataStream: AsyncIterable<string>;
}
export interface Terminal {
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать