@@ -15,6 +15,7 @@ function isNumeric(str: string | number | undefined) {
1515export interface DevToolsRpcClientOptions {
1616 connectionMeta ?: ConnectionMeta
1717 baseURL ?: string [ ]
18+ cacheResponse ?: boolean
1819 wsOptions ?: Partial < WebSocketRpcClientOptions >
1920 rpcOptions ?: Partial < BirpcOptions < DevToolsRpcServerFunctions > >
2021}
@@ -25,6 +26,7 @@ export interface ClientRpcReturn {
2526 connectionMeta : ConnectionMeta
2627 rpc : DevToolsRpcClient
2728 clientRpc : DevToolsClientRpcHost
29+ invalidateCache : ( ) => void
2830}
2931
3032export async function getDevToolsRpcClient (
@@ -33,8 +35,10 @@ export async function getDevToolsRpcClient(
3335 const {
3436 baseURL = '/.devtools/' ,
3537 rpcOptions = { } ,
38+ cacheResponse = false ,
3639 } = options
3740 const urls = Array . isArray ( baseURL ) ? baseURL : [ baseURL ]
41+ const responseCacheMap = new Map < string , unknown > ( )
3842 let connectionMeta : ConnectionMeta | undefined = options . connectionMeta
3943
4044 if ( ! connectionMeta ) {
@@ -71,15 +75,42 @@ export async function getDevToolsRpcClient(
7175 url,
7276 ...options . wsOptions ,
7377 } ) ,
74- rpcOptions,
78+ rpcOptions : {
79+ ...rpcOptions ,
80+ onRequest : async ( req , next , resolve ) => {
81+ await rpcOptions . onRequest ?.( req , next , resolve )
82+ if ( cacheResponse ) {
83+ const cacheKey = `${ req . m } -${ JSON . stringify ( req . a ) } `
84+ if ( responseCacheMap . has ( cacheKey ) ) {
85+ resolve ( responseCacheMap . get ( cacheKey ) )
86+ }
87+ else {
88+ responseCacheMap . set ( cacheKey , await next ( req ) )
89+ }
90+ }
91+ else {
92+ await next ( req )
93+ }
94+ } ,
95+ } ,
7596 } ,
7697 )
7798 // @ts -expect-error assign to readonly property
7899 context . rpc = rpc
79100
101+ function invalidateCache ( key ?: string ) {
102+ if ( key ) {
103+ responseCacheMap . delete ( key )
104+ }
105+ else {
106+ responseCacheMap . clear ( )
107+ }
108+ }
109+
80110 return {
81111 connectionMeta,
82112 rpc,
83113 clientRpc,
114+ invalidateCache,
84115 }
85116}
0 commit comments