@@ -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