terminalProcessExtHostProxy.ts 2.7 KB
Newer Older
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal';
7
import { EventEmitter } from 'events';
8
import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal';
9
import { IDisposable, toDisposable } from '../../../../base/common/lifecycle';
10

11
export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy {
12
	// For ext host processes connected checks happen on the ext host
D
Daniel Imms 已提交
13
	public connected: boolean = true;
14

15
	constructor(
16
		public terminalId: number,
17 18
		shellLaunchConfig: IShellLaunchConfig,
		cols: number,
D
Daniel Imms 已提交
19
		rows: number,
20 21
		@ITerminalService private _terminalService: ITerminalService
	) {
22 23
		super();

24
		// TODO: Return TPromise<boolean> indicating success? Teardown if failure?
25
		this._terminalService.requestExtHostProcess(this, shellLaunchConfig, cols, rows);
26 27
	}

28
	public emitData(data: string): void {
D
Daniel Imms 已提交
29 30
		this.emit('message', { type: 'data', content: data } as IMessageFromTerminalProcess);
	}
D
Daniel Imms 已提交
31

32 33
	public emitTitle(title: string): void {
		this.emit('message', { type: 'title', content: title } as IMessageFromTerminalProcess);
D
Daniel Imms 已提交
34
	}
D
Daniel Imms 已提交
35

36 37
	public emitPid(pid: number): void {
		this.emit('message', { type: 'pid', content: pid } as IMessageFromTerminalProcess);
D
Daniel Imms 已提交
38 39
	}

D
Daniel Imms 已提交
40 41 42 43
	public emitExit(exitCode: number): void {
		this.emit('exit', exitCode);
	}

44
	public send(message: IMessageToTerminalProcess): boolean {
D
Daniel Imms 已提交
45 46 47 48
		switch (message.event) {
			case 'input': this.emit('input', message.data); break;
			case 'resize': this.emit('resize', message.cols, message.rows); break;
			case 'shutdown': this.emit('shutdown'); break;
49
		}
50 51
		return true;
	}
52 53

	public onInput(listener: (data: string) => void): IDisposable {
54 55 56
		const outerListener = (data) => listener(data);
		this.on('input', data => outerListener);
		return toDisposable(() => this.removeListener('input', outerListener));
D
Daniel Imms 已提交
57 58 59
	}

	public onResize(listener: (cols: number, rows: number) => void): IDisposable {
60 61 62
		const outerListener = (cols, rows) => listener(cols, rows);
		this.on('resize', outerListener);
		return toDisposable(() => this.removeListener('resize', outerListener));
D
Daniel Imms 已提交
63 64 65
	}

	public onShutdown(listener: () => void): IDisposable {
66 67 68
		const outerListener = () => listener();
		this.on('shutdown', outerListener);
		return toDisposable(() => this.removeListener('shutdown', outerListener));
69
	}
70
}