Skip to content

Commit b4e9f2d

Browse files
committed
feat!: refactor rpc names
1 parent 19e7d76 commit b4e9f2d

15 files changed

Lines changed: 167 additions & 79 deletions

File tree

packages/core/src/client/inject/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export async function init(): Promise<void> {
1616
// eslint-disable-next-line no-console
1717
console.log('[VITE DEVTOOLS] RPC', rpc)
1818

19-
const rpcFunctions = await rpc.$call('vite:core:list-rpc-functions')
19+
const rpcFunctions = await rpc.$call('vite:internal:rpc:server:list')
2020
// eslint-disable-next-line no-console
2121
console.log('[VITE DEVTOOLS] RPC Functions', rpcFunctions)
2222

packages/core/src/client/webcomponents/components/ViewLauncher.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const props = defineProps<{
1010
}>()
1111
1212
function onLaunch() {
13-
props.context.rpc.$call('vite:core:on-dock-launch', props.entry.id)
13+
props.context.rpc.$call('vite:internal:docks:on-launch', props.entry.id)
1414
}
1515
1616
const status = computed(() => props.entry.launcher.status || 'idle')

packages/core/src/client/webcomponents/state/dock.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { DevToolsDockEntry } from '@vitejs/devtools-kit'
1+
import type { DevToolsDockEntry, DevToolsRpcClientFunctions } from '@vitejs/devtools-kit'
22
import type { ClientRpcReturn, DockEntryState, DockEntryStateEvents, DockPanelStorage, DocksContext } from '@vitejs/devtools-kit/client'
33
import type { Ref, ShallowRef } from 'vue'
44
import { createEventEmitter } from '@vitejs/devtools-kit/utils/events'
@@ -59,12 +59,12 @@ export async function useDocksEntries(rpcReturn: ClientRpcReturn): Promise<Ref<D
5959
}
6060
const dockEntries = _docksEntriesRef = shallowRef<DevToolsDockEntry[]>([])
6161
async function updateDocksEntries() {
62-
dockEntries.value = (await rpcReturn.rpc.$call('vite:core:list-dock-entries')).map(entry => Object.freeze(entry))
62+
dockEntries.value = (await rpcReturn.rpc.$call('vite:internal:docks:list')).map(entry => Object.freeze(entry))
6363
// eslint-disable-next-line no-console
6464
console.log('[VITE DEVTOOLS] Docks Entries Updated', [...dockEntries.value])
6565
}
6666
rpcReturn.clientRpc.register({
67-
name: 'vite:core:list-dock-entries:updated',
67+
name: 'vite:internal:docks:updated' satisfies keyof DevToolsRpcClientFunctions,
6868
type: 'action',
6969
handler: () => updateDocksEntries(),
7070
})

packages/core/src/node/context.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,14 @@ export async function createDevToolsContext(
4444

4545
// Register hosts side effects
4646
docksHost.events.on('dock:entry:updated', debounce(() => {
47-
rpcHost.boardcast.$callOptional('vite:core:list-dock-entries:updated')
47+
rpcHost.boardcast.$callOptional('vite:internal:docks:updated')
4848
}, 10))
49+
terminalsHost.events.on('terminal:session:updated', debounce(() => {
50+
rpcHost.boardcast.$callOptional('vite:internal:terminals:updated')
51+
}, 10))
52+
terminalsHost.events.on('terminal:session:stream-chunk', (data) => {
53+
rpcHost.boardcast.$callOptional('vite:internal:terminals:stream-chunk', data)
54+
})
4955

5056
// Register plugins
5157
const plugins = viteConfig.plugins.filter(plugin => 'devtools' in plugin)

packages/core/src/node/host-terminals.ts

Lines changed: 73 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,89 @@
1-
import type { DevToolsChildProcessTerminalOptions, DevToolsChildProcessTerminalSession, DevToolsNodeContext, DevToolsTerminalHost as DevToolsTerminalHostType, DevToolsTerminalSession, DevToolsTerminalSessionSerializable } from '@vitejs/devtools-kit'
1+
import type { DevToolsChildProcessExecuteOptions, DevToolsChildProcessTerminalSession, DevToolsNodeContext, DevToolsTerminalHost as DevToolsTerminalHostType, DevToolsTerminalSession, DevToolsTerminalSessionBase, PartialWithoutId } from '@vitejs/devtools-kit'
22
import type { Result as TinyExecResult } from 'tinyexec'
33
import process from 'node:process'
4+
import { createEventEmitter } from '@vitejs/devtools-kit/utils/events'
45

56
export class DevToolsTerminalHost implements DevToolsTerminalHostType {
7+
public readonly sessions: DevToolsTerminalHostType['sessions'] = new Map()
8+
public readonly events: DevToolsTerminalHostType['events'] = createEventEmitter()
9+
10+
private _boundStreams = new Map<string, {
11+
dispose: () => void
12+
stream: ReadableStream
13+
}>()
14+
615
constructor(
716
public readonly context: DevToolsNodeContext,
817
) {
918
}
1019

11-
readonly sessions: Map<string, DevToolsTerminalSession> = new Map()
12-
13-
serialize(session: DevToolsTerminalSession): DevToolsTerminalSessionSerializable {
14-
return {
15-
id: session.id,
16-
title: session.title,
17-
description: session.description,
18-
status: session.status,
19-
buffer: session.buffer ?? [],
20-
}
21-
}
22-
2320
register(session: DevToolsTerminalSession): DevToolsTerminalSession {
2421
if (this.sessions.has(session.id)) {
2522
throw new Error(`Terminal session with id "${session.id}" already registered`)
2623
}
2724
this.sessions.set(session.id, session)
25+
this.bindStream(session)
26+
this.events.emit('terminal:session:updated', session)
2827
return session
2928
}
3029

31-
update(session: DevToolsTerminalSession): void {
32-
if (!this.sessions.has(session.id)) {
33-
throw new Error(`Terminal session with id "${session.id}" not registered`)
30+
update(patch: PartialWithoutId<DevToolsTerminalSession>): void {
31+
if (!this.sessions.has(patch.id)) {
32+
throw new Error(`Terminal session with id "${patch.id}" not registered`)
3433
}
35-
this.sessions.set(session.id, session)
34+
const session = this.sessions.get(patch.id)!
35+
Object.assign(session, patch)
36+
this.sessions.set(patch.id, session)
37+
this.bindStream(session)
38+
this.events.emit('terminal:session:updated', session)
39+
}
40+
41+
remove(session: DevToolsTerminalSession): void {
42+
this.sessions.delete(session.id)
43+
this.events.emit('terminal:session:updated', session)
44+
this._boundStreams.delete(session.id)
45+
}
46+
47+
private bindStream(session: DevToolsTerminalSession) {
48+
// Skip when the same stream is already bound
49+
if (this._boundStreams.has(session.id) && this._boundStreams.get(session.id)?.stream === session.stream)
50+
return
51+
52+
// Dispose the previous stream
53+
this._boundStreams.get(session.id)?.dispose()
54+
this._boundStreams.delete(session.id)
55+
56+
// If new stream is not available, skip
57+
if (!session.stream)
58+
return
59+
60+
session.buffer ||= []
61+
const events = this.events
62+
const writer = new WritableStream<string>({
63+
write(chunk) {
64+
session.buffer!.push(chunk)
65+
events.emit('terminal:session:stream-chunk', {
66+
id: session.id,
67+
chunks: [chunk],
68+
ts: Date.now(),
69+
})
70+
},
71+
})
72+
session.stream.pipeTo(writer)
73+
this._boundStreams.set(session.id, {
74+
dispose: () => {
75+
writer.close()
76+
},
77+
stream: session.stream,
78+
})
3679
}
3780

38-
async startChildProcess(options: DevToolsChildProcessTerminalOptions): Promise<DevToolsChildProcessTerminalSession> {
39-
if (this.sessions.has(options.id)) {
40-
throw new Error(`Terminal session with id "${options.id}" already registered`)
81+
async startChildProcess(
82+
executeOptions: DevToolsChildProcessExecuteOptions,
83+
terminal: DevToolsTerminalSessionBase,
84+
): Promise<DevToolsChildProcessTerminalSession> {
85+
if (this.sessions.has(terminal.id)) {
86+
throw new Error(`Terminal session with id "${terminal.id}" already registered`)
4187
}
4288
const { exec } = await import('tinyexec')
4389

@@ -55,16 +101,16 @@ export class DevToolsTerminalHost implements DevToolsTerminalHostType {
55101

56102
function createChildProcess() {
57103
const cp = exec(
58-
options.command,
59-
options.args || [],
104+
executeOptions.command,
105+
executeOptions.args || [],
60106
{
61107
nodeOptions: {
62108
env: {
63109
COLORS: 'true',
64110
FORCE_COLOR: 'true',
65-
...(options.env || {}),
111+
...(executeOptions.env || {}),
66112
},
67-
cwd: options.cwd ?? process.cwd(),
113+
cwd: executeOptions.cwd ?? process.cwd(),
68114
stdio: 'pipe',
69115
},
70116
},
@@ -93,9 +139,11 @@ export class DevToolsTerminalHost implements DevToolsTerminalHostType {
93139
}
94140

95141
const session: DevToolsChildProcessTerminalSession = {
96-
...options,
142+
...terminal,
97143
status: 'running',
98144
stream: buffer,
145+
type: 'child-process',
146+
executeOptions,
99147
getChildProcess: () => cp?.process,
100148
terminate,
101149
restart,
Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,44 @@
1-
import type { RpcDefinitionsFilter, RpcDefinitionsToFunctions } from '@vitejs/devtools-kit'
2-
import { listDockEntries } from './list-dock-entries'
3-
import { listRpcFunctions } from './list-rpc-functions'
4-
import { onDockLaunch } from './on-dock-launch'
5-
import { openInEditor } from './open-in-editor'
6-
import { openInFinder } from './open-in-finder'
7-
8-
export const builtinRpcFunctions = [
9-
listRpcFunctions,
10-
listDockEntries,
1+
import type { DevToolsTerminalSessionStreamChunkEvent, RpcDefinitionsFilter, RpcDefinitionsToFunctions } from '@vitejs/devtools-kit'
2+
import { docksList } from './internal/docks-list'
3+
import { docksOnLaunch } from './internal/docks-on-launch'
4+
import { rpcServerList } from './internal/rpc-server-list'
5+
import { terminalsList } from './internal/terminals-list'
6+
import { openInEditor } from './public/open-in-editor'
7+
import { openInFinder } from './public/open-in-finder'
8+
9+
export const builtinPublicRpcDecalrations = [
1110
openInEditor,
1211
openInFinder,
13-
onDockLaunch,
1412
] as const
1513

16-
export type ServerFunctions = RpcDefinitionsToFunctions<typeof builtinRpcFunctions>
14+
export const builtinInternalRpcDecalrations = [
15+
rpcServerList,
16+
docksList,
17+
terminalsList,
18+
docksOnLaunch,
19+
] as const
20+
21+
export const builtinRpcDecalrations = [
22+
...builtinPublicRpcDecalrations,
23+
...builtinInternalRpcDecalrations,
24+
] as const
25+
26+
export type BuiltinServerFunctions = RpcDefinitionsToFunctions<typeof builtinRpcDecalrations>
1727

18-
export type ServerFunctionsStatic = RpcDefinitionsToFunctions<
19-
RpcDefinitionsFilter<typeof builtinRpcFunctions, 'static'>
28+
export type BuiltinServerFunctionsStatic = RpcDefinitionsToFunctions<
29+
RpcDefinitionsFilter<typeof builtinRpcDecalrations, 'static'>
2030
>
2131

22-
export type ServerFunctionsDump = {
23-
[K in keyof ServerFunctionsStatic]: Awaited<ReturnType<ServerFunctionsStatic[K]>>
32+
export type BuiltinServerFunctionsDump = {
33+
[K in keyof BuiltinServerFunctionsStatic]: Awaited<ReturnType<BuiltinServerFunctionsStatic[K]>>
2434
}
2535

2636
declare module '@vitejs/devtools-kit' {
27-
export interface DevToolsRpcServerFunctions extends ServerFunctions {}
37+
export interface DevToolsRpcServerFunctions extends BuiltinServerFunctions {}
2838

2939
export interface DevToolsRpcClientFunctions {
30-
'vite:core:list-dock-entries:updated': () => Promise<void>
40+
'vite:internal:docks:updated': () => Promise<void>
41+
'vite:internal:terminals:updated': () => Promise<void>
42+
'vite:internal:terminals:stream-chunk': (data: DevToolsTerminalSessionStreamChunkEvent) => Promise<void>
3143
}
3244
}

packages/core/src/node/rpc/list-dock-entries.ts renamed to packages/core/src/node/rpc/internal/docks-list.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { defineRpcFunction } from '@vitejs/devtools-kit'
22

3-
export const listDockEntries = defineRpcFunction({
4-
name: 'vite:core:list-dock-entries',
5-
type: 'query',
3+
export const docksList = defineRpcFunction({
4+
name: 'vite:internal:docks:list',
5+
type: 'static',
66
setup: (context) => {
77
return {
88
handler: () => Array.from(context.docks.values()),

packages/core/src/node/rpc/on-dock-launch.ts renamed to packages/core/src/node/rpc/internal/docks-on-launch.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineRpcFunction } from '@vitejs/devtools-kit'
22

3-
export const onDockLaunch = defineRpcFunction({
4-
name: 'vite:core:on-dock-launch',
3+
export const docksOnLaunch = defineRpcFunction({
4+
name: 'vite:internal:docks:on-launch',
55
type: 'action',
66
setup: (context) => {
77
const launchMap = new Map<string, Promise<void>>()

packages/core/src/node/rpc/list-rpc-functions.ts renamed to packages/core/src/node/rpc/internal/rpc-server-list.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { defineRpcFunction } from '@vitejs/devtools-kit'
22

3-
export const listRpcFunctions = defineRpcFunction({
4-
name: 'vite:core:list-rpc-functions',
5-
type: 'action',
3+
export const rpcServerList = defineRpcFunction({
4+
name: 'vite:internal:rpc:server:list',
5+
type: 'static',
66
setup: (context) => {
77
return {
88
async handler() {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { DevToolsTerminalSessionBase } from '@vitejs/devtools-kit'
2+
import { defineRpcFunction } from '@vitejs/devtools-kit'
3+
4+
export const terminalsList = defineRpcFunction({
5+
name: 'vite:internal:terminals:list',
6+
type: 'static',
7+
setup: (context) => {
8+
return {
9+
async handler() {
10+
return Array.from(context.terminals.sessions.values())
11+
.map((i): DevToolsTerminalSessionBase => {
12+
return {
13+
id: i.id,
14+
title: i.title,
15+
description: i.description,
16+
status: i.status,
17+
}
18+
})
19+
},
20+
}
21+
},
22+
})

0 commit comments

Comments
 (0)