Path: blob/main/src/vs/base/parts/ipc/electron-main/ipc.electron.ts
4780 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { WebContents } from 'electron';6import { validatedIpcMain } from './ipcMain.js';7import { VSBuffer } from '../../../common/buffer.js';8import { Emitter, Event } from '../../../common/event.js';9import { IDisposable, toDisposable } from '../../../common/lifecycle.js';10import { ClientConnectionEvent, IPCServer } from '../common/ipc.js';11import { Protocol as ElectronProtocol } from '../common/ipc.electron.js';1213interface IIPCEvent {14event: { sender: WebContents };15message: Buffer | null;16}1718function createScopedOnMessageEvent(senderId: number, eventName: string): Event<VSBuffer | null> {19const onMessage = Event.fromNodeEventEmitter<IIPCEvent>(validatedIpcMain, eventName, (event, message) => ({ event, message }));20const onMessageFromSender = Event.filter(onMessage, ({ event }) => event.sender.id === senderId);2122return Event.map(onMessageFromSender, ({ message }) => message ? VSBuffer.wrap(message) : message);23}2425/**26* An implementation of `IPCServer` on top of Electron `ipcMain` API.27*/28export class Server extends IPCServer {2930private static readonly Clients = new Map<number, IDisposable>();3132private static getOnDidClientConnect(): Event<ClientConnectionEvent> {33const onHello = Event.fromNodeEventEmitter<WebContents>(validatedIpcMain, 'vscode:hello', ({ sender }) => sender);3435return Event.map(onHello, webContents => {36const id = webContents.id;37const client = Server.Clients.get(id);3839client?.dispose();4041const onDidClientReconnect = new Emitter<void>();42Server.Clients.set(id, toDisposable(() => onDidClientReconnect.fire()));4344const onMessage = createScopedOnMessageEvent(id, 'vscode:message') as Event<VSBuffer>;45const onDidClientDisconnect = Event.any(Event.signal(createScopedOnMessageEvent(id, 'vscode:disconnect')), onDidClientReconnect.event);46const protocol = new ElectronProtocol(webContents, onMessage);4748return { protocol, onDidClientDisconnect };49});50}5152constructor() {53super(Server.getOnDidClientConnect());54}55}565758