@@ -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 (
@@ -36,6 +38,8 @@ export async function getDevToolsRpcClient(
3638 } = options
3739 const urls = Array . isArray ( baseURL ) ? baseURL : [ baseURL ]
3840 let connectionMeta : ConnectionMeta | undefined = options . connectionMeta
41+ let cacheResponseEnabled = options . cacheResponse ?? false
42+ const responseCacheMap = new Map < string , unknown > ( )
3943
4044 if ( ! connectionMeta ) {
4145 const errors : Error [ ] = [ ]
@@ -71,15 +75,43 @@ 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 ( cacheResponseEnabled ) {
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+ cacheResponseEnabled = false
107+ responseCacheMap . clear ( )
108+ }
109+ }
110+
80111 return {
81112 connectionMeta,
82113 rpc,
83114 clientRpc,
115+ invalidateCache,
84116 }
85117}
0 commit comments