Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/parts/ipc/electron-main/ipc.electron.ts
4780 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { WebContents } from 'electron';
7
import { validatedIpcMain } from './ipcMain.js';
8
import { VSBuffer } from '../../../common/buffer.js';
9
import { Emitter, Event } from '../../../common/event.js';
10
import { IDisposable, toDisposable } from '../../../common/lifecycle.js';
11
import { ClientConnectionEvent, IPCServer } from '../common/ipc.js';
12
import { Protocol as ElectronProtocol } from '../common/ipc.electron.js';
13
14
interface IIPCEvent {
15
event: { sender: WebContents };
16
message: Buffer | null;
17
}
18
19
function createScopedOnMessageEvent(senderId: number, eventName: string): Event<VSBuffer | null> {
20
const onMessage = Event.fromNodeEventEmitter<IIPCEvent>(validatedIpcMain, eventName, (event, message) => ({ event, message }));
21
const onMessageFromSender = Event.filter(onMessage, ({ event }) => event.sender.id === senderId);
22
23
return Event.map(onMessageFromSender, ({ message }) => message ? VSBuffer.wrap(message) : message);
24
}
25
26
/**
27
* An implementation of `IPCServer` on top of Electron `ipcMain` API.
28
*/
29
export class Server extends IPCServer {
30
31
private static readonly Clients = new Map<number, IDisposable>();
32
33
private static getOnDidClientConnect(): Event<ClientConnectionEvent> {
34
const onHello = Event.fromNodeEventEmitter<WebContents>(validatedIpcMain, 'vscode:hello', ({ sender }) => sender);
35
36
return Event.map(onHello, webContents => {
37
const id = webContents.id;
38
const client = Server.Clients.get(id);
39
40
client?.dispose();
41
42
const onDidClientReconnect = new Emitter<void>();
43
Server.Clients.set(id, toDisposable(() => onDidClientReconnect.fire()));
44
45
const onMessage = createScopedOnMessageEvent(id, 'vscode:message') as Event<VSBuffer>;
46
const onDidClientDisconnect = Event.any(Event.signal(createScopedOnMessageEvent(id, 'vscode:disconnect')), onDidClientReconnect.event);
47
const protocol = new ElectronProtocol(webContents, onMessage);
48
49
return { protocol, onDidClientDisconnect };
50
});
51
}
52
53
constructor() {
54
super(Server.getOnDidClientConnect());
55
}
56
}
57
58