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