Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/build/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { join } from 'node:path'
import { pathToFileURL } from 'node:url'
import { root } from './root.ts'

export const threshold = 530_000
export const threshold = 532_000

export const instantiations = 8000

Expand Down
2 changes: 2 additions & 0 deletions packages/diff-view/src/parts/CommandMap/CommandMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { handleContextMenu } from '../HandleContextMenu/HandleContextMenu.ts'
import { handleCopy } from '../HandleCopy/HandleCopy.ts'
import { handleCut } from '../HandleCut/HandleCut.ts'
import { handleInput } from '../HandleInput/HandleInput.ts'
import { handleMessagePort } from '../HandleMessagePort/HandleMessagePort.ts'
import { handlePaste } from '../HandlePaste/HandlePaste.ts'
import { handleResize } from '../HandleResize/HandleResize.ts'
import { handleSashPointerDown } from '../HandleSashPointerDown/HandleSashPointerDown.ts'
Expand Down Expand Up @@ -66,6 +67,7 @@ export const commandMap = {
'DiffView.handleCopy': wrapCommand(handleCopy),
'DiffView.handleCut': wrapCommand(handleCut),
'DiffView.handleInput': wrapCommand(handleInput),
'DiffView.handleMessagePort': handleMessagePort,
'DiffView.handlePaste': wrapCommand(handlePaste),
'DiffView.handleResize': wrapCommand(handleResize),
'DiffView.handleSashPointerDown': wrapCommand(handleSashPointerDown),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { PlainMessagePortRpc } from '@lvce-editor/rpc'
import * as RendererProcess from '../RendererProcess/RendererProcess.ts'

export const handleMessagePort = async (port: any): Promise<void> => {
const rpc = await PlainMessagePortRpc.create({ commandMap: {}, messagePort: port })
RendererProcess.set(rpc)
}
13 changes: 11 additions & 2 deletions packages/diff-view/src/parts/Render2/Render2.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import * as ApplyRender from '../ApplyRender/ApplyRender.ts'
import * as DiffViewStates from '../DiffViewStates/DiffViewStates.ts'
import * as RendererProcess from '../RendererProcess/RendererProcess.ts'

export const render2 = (uid: number, diffResult: readonly number[]): readonly any[] => {
export const render2 = (uid: number, diffResult: readonly number[]): readonly any[] | Promise<readonly any[]> => {
const { newState, oldState } = DiffViewStates.get(uid)
DiffViewStates.set(uid, newState, newState)
const commands = ApplyRender.applyRender(oldState, newState, diffResult)
return commands
if (!RendererProcess.isConnected()) return commands
return renderDirect(uid, commands)
}

const renderDirect = async (uid: number, commands: readonly any[]): Promise<readonly any[]> => {
const rendererWorkerCommands = commands.filter((command) => command[0] === 'Viewlet.setFocusContext')
const rendererProcessCommands = commands.filter((command) => command[0] !== 'Viewlet.setFocusContext')
const transactionId = await RendererProcess.invoke('Viewlet.queueCommands', uid, rendererProcessCommands)
return [...rendererWorkerCommands, ['Viewlet.commitPending', uid, transactionId]]
}
13 changes: 13 additions & 0 deletions packages/diff-view/src/parts/RendererProcess/RendererProcess.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Rpc } from '@lvce-editor/rpc'
import { RendererProcess as RendererProcessRegistry } from '@lvce-editor/rpc-registry'

const state = { connected: false }
export const isConnected = (): boolean => {
const { connected } = state
return connected
}
export const invoke = (method: string, ...params: readonly unknown[]): Promise<any> => RendererProcessRegistry.invoke(method, ...params)
export const set = (rpc: Rpc): void => {
RendererProcessRegistry.set(rpc)
state.connected = true
}
24 changes: 24 additions & 0 deletions packages/diff-view/test/HandleMessagePort.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { expect, jest, test } from '@jest/globals'
import { PlainMessagePortRpcParent } from '@lvce-editor/rpc'
import { RendererProcess as RendererProcessRegistry } from '@lvce-editor/rpc-registry'
import { handleMessagePort } from '../src/parts/HandleMessagePort/HandleMessagePort.ts'
import * as RendererProcess from '../src/parts/RendererProcess/RendererProcess.ts'

declare const MessageChannel: { new (): any }

test('connects the view directly to the renderer process', async () => {
const queueCommands = jest.fn((_uid: number, _commands: readonly unknown[]) => 31)
const { port1, port2 } = new MessageChannel()
const rendererProcessRpc = await PlainMessagePortRpcParent.create({
commandMap: { 'Viewlet.queueCommands': queueCommands },
messagePort: port1,
})

await handleMessagePort(port2)
expect(RendererProcess.isConnected()).toBe(true)
await expect(RendererProcess.invoke('Viewlet.queueCommands', 7, [['Viewlet.setDom2', 7, []]])).resolves.toBe(31)
expect(queueCommands).toHaveBeenCalledWith(7, [['Viewlet.setDom2', 7, []]])

await RendererProcessRegistry.dispose()
await rendererProcessRpc.dispose()
})