1import type { Protocol } from 'devtools-protocol'; 2 3import { 4 CdpMessage, 5 InspectorHandler, 6 DeviceRequest, 7 DebuggerRequest, 8 DebuggerResponse, 9 DeviceResponse, 10} from './types'; 11import { ExpoDebuggerInfo } from '../device'; 12 13export class NetworkResponseHandler implements InspectorHandler { 14 /** All known responses, mapped by request id */ 15 storage = new Map<string, DebuggerResponse<NetworkGetResponseBody>['result']>(); 16 17 onDeviceMessage(message: DeviceRequest<NetworkReceivedResponseBody>) { 18 if (message.method === 'Expo(Network.receivedResponseBody)') { 19 const { requestId, ...requestInfo } = message.params; 20 this.storage.set(requestId, requestInfo); 21 return true; 22 } 23 24 return false; 25 } 26 27 onDebuggerMessage( 28 message: DebuggerRequest<NetworkGetResponseBody>, 29 { socket }: ExpoDebuggerInfo 30 ) { 31 if ( 32 message.method === 'Network.getResponseBody' && 33 this.storage.has(message.params.requestId) 34 ) { 35 const response: DeviceResponse<NetworkGetResponseBody> = { 36 id: message.id, 37 result: this.storage.get(message.params.requestId)!, 38 }; 39 40 socket.send(JSON.stringify(response)); 41 return true; 42 } 43 44 return false; 45 } 46} 47 48/** Custom message to transfer the response body data to the proxy */ 49export type NetworkReceivedResponseBody = CdpMessage< 50 'Expo(Network.receivedResponseBody)', 51 Protocol.Network.GetResponseBodyRequest & Protocol.Network.GetResponseBodyResponse, 52 never 53>; 54 55/** @see https://chromedevtools.github.io/devtools-protocol/1-2/Network/#method-getResponseBody */ 56export type NetworkGetResponseBody = CdpMessage< 57 'Network.getResponseBody', 58 Protocol.Network.GetResponseBodyRequest, 59 Protocol.Network.GetResponseBodyResponse 60>; 61