From 122e215bc559b36c6778681d7259e932a039a56c Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Mon, 17 Aug 2026 08:21:15 +0000 Subject: [PATCH] feature: support secondary direct view connections --- .../src/parts/CommandMap/CommandMap.ts | 2 +- .../HandleMessagePort/HandleMessagePort.ts | 6 +++-- .../diff-view/test/HandleMessagePort.test.ts | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/diff-view/src/parts/CommandMap/CommandMap.ts b/packages/diff-view/src/parts/CommandMap/CommandMap.ts index 74cea8d..c92c2fa 100644 --- a/packages/diff-view/src/parts/CommandMap/CommandMap.ts +++ b/packages/diff-view/src/parts/CommandMap/CommandMap.ts @@ -47,7 +47,7 @@ import { showSearch } from '../ShowSearch/ShowSearch.ts' import { toggleDiffMode } from '../ToggleDiffMode/ToggleDiffMode.ts' import { toggleWhitespace } from '../ToggleWhitespace/ToggleWhitespace.ts' -const handleDirectMessagePort = (port: any): Promise => handleMessagePort(port, commandMap) +const handleDirectMessagePort = (port: any, setAsRendererProcess = true): Promise => handleMessagePort(port, commandMap, setAsRendererProcess) export const commandMap = { 'Diff.getCommandIds': getCommandIds, diff --git a/packages/diff-view/src/parts/HandleMessagePort/HandleMessagePort.ts b/packages/diff-view/src/parts/HandleMessagePort/HandleMessagePort.ts index 3d90e8e..5aec9e7 100644 --- a/packages/diff-view/src/parts/HandleMessagePort/HandleMessagePort.ts +++ b/packages/diff-view/src/parts/HandleMessagePort/HandleMessagePort.ts @@ -2,7 +2,7 @@ import { PlainMessagePortRpc } from '@lvce-editor/rpc' import { RendererWorker } from '@lvce-editor/rpc-registry' import * as RendererProcess from '../RendererProcess/RendererProcess.ts' -export const handleMessagePort = async (port: any, viewletCommandMap: Readonly>): Promise => { +export const handleMessagePort = async (port: any, viewletCommandMap: Readonly>, setAsRendererProcess = true): Promise => { const executeViewletCommand = async (uid: number, command: string, ...args: readonly any[]): Promise => { const fn = viewletCommandMap[`DiffView.${command}`] if (typeof fn !== 'function') { @@ -18,5 +18,7 @@ export const handleMessagePort = async (port: any, viewletCommandMap: Readonly { await RendererWorker.dispose() await rendererProcessRpc.dispose() }) + +test('keeps the renderer process rpc for a secondary direct connection', async () => { + const queueCommands = jest.fn((_uid: number, _commands: readonly unknown[]) => 31) + RendererProcessRegistry.set( + Object.assign( + createMockRpc({ + commandMap: { 'Viewlet.queueCommands': queueCommands }, + }), + { dispose: jest.fn() }, + ), + ) + const { port1, port2 } = new MessageChannel() + + await handleMessagePort(port2, {}, false) + + expect(RendererProcess.invoke('Viewlet.queueCommands', 7, [])).toBe(31) + expect(queueCommands).toHaveBeenCalledWith(7, []) + + port1.close() + port2.close() + await RendererProcessRegistry.dispose() +})