提交 674c9d6a 编写于 作者: J Joao Moreno

ipc: fix electron ipc disconnect event

上级 cc0b4278
......@@ -443,6 +443,10 @@ export function filterEvent<T>(event: Event<T>, filter: (e: T) => boolean): Even
return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables);
}
export function signalEvent<T>(event: Event<T>): Event<void> {
return event as Event<any> as Event<void>;
}
class ChainableEvent<T> implements IChainableEvent<T> {
get event(): Event<T> { return this._event; }
......
......@@ -7,8 +7,11 @@ import { fromNodeEventEmitter } from 'vs/base/common/event';
import { IPCClient } from 'vs/base/parts/ipc/node/ipc';
import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron';
import { ipcRenderer } from 'electron';
import { IDisposable } from 'vs/base/common/lifecycle';
export class Client extends IPCClient {
export class Client extends IPCClient implements IDisposable {
private protocol: Protocol;
private static createProtocol(): Protocol {
const onMessage = fromNodeEventEmitter<string>(ipcRenderer, 'ipc:message', (_, message: string) => message);
......@@ -17,6 +20,12 @@ export class Client extends IPCClient {
}
constructor(id: string) {
super(Client.createProtocol(), id);
const protocol = Client.createProtocol();
super(protocol, id);
this.protocol = protocol;
}
dispose(): void {
this.protocol.dispose();
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Event, filterEvent, mapEvent, fromNodeEventEmitter } from 'vs/base/common/event';
import { Event, filterEvent, mapEvent, fromNodeEventEmitter, signalEvent } from 'vs/base/common/event';
import { IPCServer, ClientConnectionEvent } from 'vs/base/parts/ipc/node/ipc';
import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron';
import { ipcMain } from 'electron';
......@@ -17,8 +17,8 @@ interface IIPCEvent {
message: string;
}
function createScopedOnMessageEvent(senderId: number): Event<string> {
const onMessage = fromNodeEventEmitter<IIPCEvent>(ipcMain, 'ipc:message', (event, message: string) => ({ event, message }));
function createScopedOnMessageEvent(senderId: number, eventName: string): Event<string> {
const onMessage = fromNodeEventEmitter<IIPCEvent>(ipcMain, eventName, (event, message: string) => ({ event, message }));
const onMessageFromSender = filterEvent(onMessage, ({ event }) => event.sender.getId() === senderId);
return mapEvent(onMessageFromSender, ({ message }) => message);
}
......@@ -29,9 +29,9 @@ export class Server extends IPCServer {
const onHello = fromNodeEventEmitter<WebContents>(ipcMain, 'ipc:hello', ({ sender }) => sender);
return mapEvent(onHello, webContents => {
const onMessage = createScopedOnMessageEvent(webContents.getId());
const onMessage = createScopedOnMessageEvent(webContents.getId(), 'ipc:message');
const onDidClientDisconnect = signalEvent(createScopedOnMessageEvent(webContents.getId(), 'ipc:disconnect'));
const protocol = new Protocol(webContents, onMessage);
const onDidClientDisconnect = fromNodeEventEmitter<void>(webContents, 'destroyed');
return { protocol, onDidClientDisconnect };
});
......
......@@ -36,6 +36,7 @@ export class Protocol implements IMessagePassingProtocol {
}
dispose(): void {
this.sender.send('ipc:disconnect', null);
this.listener = dispose(this.listener);
}
}
\ No newline at end of file
......@@ -523,6 +523,8 @@ export class WorkbenchShell extends Disposable {
if (this.workbench) {
this.workbench.dispose(reason);
}
this.mainProcessClient.dispose();
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册