11/* eslint-disable no-console */
2- import type { ConnectionMeta , DevToolsNodeContext , DevToolsRpcClientFunctions , DevToolsRpcServerFunctions } from '@vitejs/devtools-kit'
2+ import type { ConnectionMeta , DevToolsNodeContext , DevToolsNodeRpcSession , DevToolsRpcClientFunctions , DevToolsRpcServerFunctions } from '@vitejs/devtools-kit'
33import type { WebSocket } from 'ws'
44import type { RpcFunctionsHost } from './host-functions'
5+ import { AsyncLocalStorage } from 'node:async_hooks'
56import { createRpcServer } from '@vitejs/devtools-rpc'
67import { createWsRpcPreset } from '@vitejs/devtools-rpc/presets/ws/server'
78import c from 'ansis'
@@ -23,16 +24,18 @@ export async function createWsServer(options: CreateWsServerOptions) {
2324
2425 const preset = createWsRpcPreset ( {
2526 port : port ! ,
26- onConnected : ( ws ) => {
27+ onConnected : ( ws , meta ) => {
2728 wsClients . add ( ws )
28- console . log ( c . green `${ MARK_CHECK } Websocket client connected` )
29+ console . log ( c . green `${ MARK_CHECK } Websocket client [ ${ meta . id } ] connected` )
2930 } ,
30- onDisconnected : ( ws ) => {
31+ onDisconnected : ( ws , meta ) => {
3132 wsClients . delete ( ws )
32- console . log ( c . red `${ MARK_CHECK } Websocket client disconnected` )
33+ console . log ( c . red `${ MARK_CHECK } Websocket client [ ${ meta . id } ] disconnected` )
3334 } ,
3435 } )
3536
37+ const asyncStorage = new AsyncLocalStorage < DevToolsNodeRpcSession > ( )
38+
3639 const rpcGroup = createRpcServer < DevToolsRpcClientFunctions , DevToolsRpcServerFunctions > (
3740 rpcHost . functions ,
3841 {
@@ -46,11 +49,26 @@ export async function createWsServer(options: CreateWsServerOptions) {
4649 console . error ( c . red `⬢ RPC error on executing rpc` )
4750 console . error ( error )
4851 } ,
52+ resolver ( name , fn ) {
53+ if ( ! fn )
54+ return undefined
55+ // eslint-disable-next-line ts/no-this-alias
56+ const rpc = this
57+ return async function ( this : any , ...args ) {
58+ return await asyncStorage . run ( {
59+ rpc,
60+ meta : rpc . $meta ,
61+ } , async ( ) => {
62+ return ( await fn ) . apply ( this , args )
63+ } )
64+ }
65+ } ,
4966 } ,
5067 } ,
5168 )
5269
53- rpcHost . rpcGroup = rpcGroup
70+ rpcHost . _rpcGroup = rpcGroup
71+ rpcHost . _asyncStorage = asyncStorage
5472
5573 const getConnectionMeta = async ( ) : Promise < ConnectionMeta > => {
5674 return {
0 commit comments