@@ -13,15 +13,15 @@ import {
1313import { observer , disposeOnUnmount , inject } from 'mobx-react' ;
1414import * as portals from 'react-reverse-portal' ;
1515
16- import { WithInjected , CollectedEvent , HttpExchangeView } from '../../types' ;
16+ import { WithInjected , CollectedEvent , HttpExchangeView , RawTunnel } from '../../types' ;
1717import { NARROW_LAYOUT_BREAKPOINT , styled } from '../../styles' ;
1818import { useHotkeys , isEditable , windowSize , AriaCtrlCmd , Ctrl } from '../../util/ui' ;
1919import { debounceComputed } from '../../util/observable' ;
2020import { UnreachableCheck , unreachableCheck } from '../../util/error' ;
2121
2222import { SERVER_SEND_API_SUPPORTED , serverVersion , versionSatisfies } from '../../services/service-versions' ;
2323
24- import { UiStore } from '../../model/ui/ui-store' ;
24+ import { ExpandableViewCardKey , UiStore } from '../../model/ui/ui-store' ;
2525import { ProxyStore } from '../../model/proxy-store' ;
2626import { EventsStore } from '../../model/events/events-store' ;
2727import { RulesStore } from '../../model/rules/rules-store' ;
@@ -45,6 +45,7 @@ import { TlsTunnelDetailsPane } from './tls/tls-tunnel-details-pane';
4545import { RTCDataChannelDetailsPane } from './rtc/rtc-data-channel-details-pane' ;
4646import { RTCMediaDetailsPane } from './rtc/rtc-media-details-pane' ;
4747import { RTCConnectionDetailsPane } from './rtc/rtc-connection-details-pane' ;
48+ import { RawTunnelDetailsPane } from './raw-tunnel-details-pane' ;
4849
4950interface ViewPageProps {
5051 className ?: string ;
@@ -142,6 +143,19 @@ const EDITOR_KEYS = [
142143] as const ;
143144type EditorKey = typeof EDITOR_KEYS [ number ] ;
144145
146+ const paneExpansionRequirements : { [ key in ExpandableViewCardKey ] : ( event : CollectedEvent ) => boolean } = {
147+ requestBody : ( event : CollectedEvent ) =>
148+ event . isHttp ( ) &&
149+ ( event . hasRequestBody ( ) || ! ! event . downstream . requestBreakpoint ) ,
150+ responseBody : ( event : CollectedEvent ) =>
151+ event . isHttp ( ) &&
152+ ( event . hasResponseBody ( ) || ! ! event . downstream . responseBreakpoint ) ,
153+ webSocketMessages : ( event : CollectedEvent ) =>
154+ event . isWebSocket ( ) && event . wasAccepted ,
155+ rawTunnelPackets : ( event : CollectedEvent ) =>
156+ event . isRawTunnel ( )
157+ } ;
158+
145159@inject ( 'eventsStore' )
146160@inject ( 'proxyStore' )
147161@inject ( 'uiStore' )
@@ -279,33 +293,14 @@ class ViewPage extends React.Component<ViewPageProps> {
279293 }
280294
281295 const { expandedViewCard } = this . props . uiStore ;
282- if ( ! expandedViewCard ) return ;
283-
284- const selectedHttpExchange = this . selectedExchange ;
285-
286- // If you have a pane expanded, and select an event with no data
287- // for that pane, then disable the expansion:
288- if (
289- ! selectedHttpExchange ||
290- (
291- expandedViewCard === 'requestBody' &&
292- ! selectedHttpExchange . hasRequestBody ( ) &&
293- ! selectedHttpExchange . downstream . requestBreakpoint
294- ) ||
295- (
296- expandedViewCard === 'responseBody' &&
297- ! selectedHttpExchange . hasResponseBody ( ) &&
298- ! selectedHttpExchange . downstream . responseBreakpoint
299- ) ||
300- (
301- expandedViewCard === 'webSocketMessages' &&
302- ! ( selectedHttpExchange . isWebSocket ( ) && selectedHttpExchange . wasAccepted )
303- )
304- ) {
305- runInAction ( ( ) => {
306- this . props . uiStore . expandedViewCard = undefined ;
307- } ) ;
308- return ;
296+ if ( expandedViewCard ) {
297+ // If you have a pane expanded, and select an event with no data
298+ // for that pane, then disable the expansion:
299+ if ( ! paneExpansionRequirements [ expandedViewCard ] ( selectedEvent ) ) {
300+ runInAction ( ( ) => {
301+ this . props . uiStore . expandedViewCard = undefined ;
302+ } ) ;
303+ }
309304 }
310305 } ) ) ;
311306
@@ -404,6 +399,12 @@ class ViewPage extends React.Component<ViewPageProps> {
404399 answerEditor = { this . editors . response }
405400 navigate = { this . props . navigate }
406401 />
402+ } else if ( this . selectedEvent . isRawTunnel ( ) ) {
403+ rightPane = < RawTunnelDetailsPane
404+ tunnel = { this . selectedEvent }
405+ streamMessageEditor = { this . editors . streamMessage }
406+ isPaidUser = { isPaidUser }
407+ />
407408 } else {
408409 throw new UnreachableCheck ( this . selectedEvent ) ;
409410 }
0 commit comments