Skip to content

Commit cdc834f

Browse files
committed
Support collapse & expand for raw packets, and refactor expansion
1 parent bda519d commit cdc834f

File tree

3 files changed

+51
-47
lines changed

3 files changed

+51
-47
lines changed

src/components/view/raw-tunnel-details-pane.tsx

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
import * as _ from 'lodash';
22
import * as React from 'react';
33
import * as portals from 'react-reverse-portal';
4+
import { inject, observer } from 'mobx-react';
45

56
import { getReadableIP } from '../../model/network';
67
import { RawTunnel } from '../../model/raw-tunnel';
8+
import { UiStore } from '../../model/ui/ui-store';
79

810
import { MediumCard } from '../common/card';
911
import { ContentLabelBlock, Content, CopyableMonoValue } from '../common/text-content';
1012
import { PaneScrollContainer } from './view-details-pane';
1113
import { StreamMessageListCard } from './stream-message-list-card';
1214
import { SelfSizedEditor } from '../editor/base-editor';
1315

16+
@inject('uiStore')
17+
@observer
1418
export class RawTunnelDetailsPane extends React.Component<{
1519
tunnel: RawTunnel,
1620
streamMessageEditor: portals.HtmlPortalNode<typeof SelfSizedEditor>,
17-
isPaidUser: boolean
21+
isPaidUser: boolean,
22+
uiStore?: UiStore
1823
}> {
1924
render() {
2025
const { tunnel } = this.props;
@@ -23,6 +28,22 @@ export class RawTunnelDetailsPane extends React.Component<{
2328
const sourceIp = sourceDetailParts[0];
2429
const sourceDetails = sourceDetailParts.slice(1).join(' ');
2530

31+
const packetCardProps = this.props.uiStore!.viewCardProps['rawTunnelPackets'];
32+
33+
const packetsListCard = <StreamMessageListCard
34+
isPaidUser={this.props.isPaidUser}
35+
{...packetCardProps}
36+
37+
streamId={tunnel.id}
38+
cardHeading='Raw Data'
39+
streamLabel={tunnel.upstreamHostname}
40+
editorNode={this.props.streamMessageEditor}
41+
filenamePrefix={`Raw Tunnel ${tunnel.upstreamHostname} ${tunnel.id}`}
42+
messages={tunnel.packets}
43+
/>;
44+
45+
if (packetCardProps.expanded) return packetsListCard;
46+
2647
return <PaneScrollContainer>
2748
<MediumCard>
2849
<header>
@@ -50,23 +71,7 @@ export class RawTunnelDetailsPane extends React.Component<{
5071
</p>
5172
</Content>
5273
</MediumCard>
53-
<StreamMessageListCard
54-
isPaidUser={this.props.isPaidUser}
55-
ariaLabel='Raw tunnel data'
56-
57-
collapsed={false}
58-
expanded={true}
59-
onExpandToggled={() => {}}
60-
onCollapseToggled={() => {}}
61-
62-
streamId={tunnel.id}
63-
cardHeading='Raw Data'
64-
streamLabel={tunnel.upstreamHostname}
65-
editorNode={this.props.streamMessageEditor}
66-
filenamePrefix={`Raw Tunnel ${tunnel.upstreamHostname} ${tunnel.id}`}
67-
messages={tunnel.packets}
68-
/>
69-
74+
{ packetsListCard }
7075
</PaneScrollContainer>;
7176
}
7277
}

src/components/view/view-page.tsx

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { UnreachableCheck, unreachableCheck } from '../../util/error';
2121

2222
import { 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';
2525
import { ProxyStore } from '../../model/proxy-store';
2626
import { EventsStore } from '../../model/events/events-store';
2727
import { RulesStore } from '../../model/rules/rules-store';
@@ -143,6 +143,19 @@ const EDITOR_KEYS = [
143143
] as const;
144144
type EditorKey = typeof EDITOR_KEYS[number];
145145

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+
146159
@inject('eventsStore')
147160
@inject('proxyStore')
148161
@inject('uiStore')
@@ -280,33 +293,14 @@ class ViewPage extends React.Component<ViewPageProps> {
280293
}
281294

282295
const { expandedViewCard } = this.props.uiStore;
283-
if (!expandedViewCard) return;
284-
285-
const selectedHttpExchange = this.selectedExchange;
286-
287-
// If you have a pane expanded, and select an event with no data
288-
// for that pane, then disable the expansion:
289-
if (
290-
!selectedHttpExchange ||
291-
(
292-
expandedViewCard === 'requestBody' &&
293-
!selectedHttpExchange.hasRequestBody() &&
294-
!selectedHttpExchange.downstream.requestBreakpoint
295-
) ||
296-
(
297-
expandedViewCard === 'responseBody' &&
298-
!selectedHttpExchange.hasResponseBody() &&
299-
!selectedHttpExchange.downstream.responseBreakpoint
300-
) ||
301-
(
302-
expandedViewCard === 'webSocketMessages' &&
303-
!(selectedHttpExchange.isWebSocket() && selectedHttpExchange.wasAccepted)
304-
)
305-
) {
306-
runInAction(() => {
307-
this.props.uiStore.expandedViewCard = undefined;
308-
});
309-
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+
}
310304
}
311305
}));
312306

src/model/ui/ui-store.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ const VIEW_CARD_KEYS = [
3535
'rtcSessionOffer',
3636
'rtcSessionAnswer',
3737

38+
'rawTunnelPackets',
39+
3840
'performance',
3941
'export'
4042
] as const;
@@ -43,7 +45,8 @@ type ViewCardKey = typeof VIEW_CARD_KEYS[number];
4345
const EXPANDABLE_VIEW_CARD_KEYS = [
4446
'requestBody',
4547
'responseBody',
46-
'webSocketMessages'
48+
'webSocketMessages',
49+
'rawTunnelPackets'
4750
] as const;
4851
export type ExpandableViewCardKey = typeof EXPANDABLE_VIEW_CARD_KEYS[number];
4952

@@ -240,6 +243,8 @@ export class UiStore {
240243
'webSocketMessages': { collapsed: false },
241244
'webSocketClose': { collapsed: false },
242245

246+
'rawTunnelPackets': { collapsed: false },
247+
243248
'rtcConnection': { collapsed: false },
244249
'rtcSessionOffer': { collapsed: false },
245250
'rtcSessionAnswer': { collapsed: false },

0 commit comments

Comments
 (0)