Skip to content

Commit be0f5db

Browse files
dimitropoulosmarckong
authored andcommitted
[INS-1697] Create WebSocket Request (#5041)
* wip * add fail safe Co-authored-by: Mark Kim <[email protected]>
1 parent 623fe7f commit be0f5db

11 files changed

+150
-38
lines changed

packages/insomnia/src/common/render.ts

+1
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ export async function getRenderContextAncestors(base?: Request | GrpcRequest | W
562562
return await db.withAncestors<RenderContextAncestor>(base || null, [
563563
models.request.type,
564564
models.grpcRequest.type,
565+
models.websocketRequest.type,
565566
models.requestGroup.type,
566567
models.workspace.type,
567568
models.project.type,

packages/insomnia/src/models/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import * as _stats from './stats';
3535
import * as _unitTest from './unit-test';
3636
import * as _unitTestResult from './unit-test-result';
3737
import * as _unitTestSuite from './unit-test-suite';
38+
import * as _websocketRequest from './websocket-request';
3839
import * as _workspace from './workspace';
3940
import * as _workspaceMeta from './workspace-meta';
4041

@@ -75,6 +76,7 @@ export const protoFile = _protoFile;
7576
export const protoDirectory = _protoDirectory;
7677
export const grpcRequest = _grpcRequest;
7778
export const grpcRequestMeta = _grpcRequestMeta;
79+
export const websocketRequest = _websocketRequest;
7880
export const workspace = _workspace;
7981
export const workspaceMeta = _workspaceMeta;
8082

@@ -108,6 +110,7 @@ export function all() {
108110
protoDirectory,
109111
grpcRequest,
110112
grpcRequestMeta,
113+
websocketRequest,
111114
] as const;
112115
}
113116

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { database } from '../common/database';
2+
import type { BaseModel } from '.';
3+
4+
export const name = 'WebSocket Request';
5+
6+
export const type = 'WebSocketRequest';
7+
8+
export const prefix = 'ws-req';
9+
10+
export const canDuplicate = true;
11+
12+
export const canSync = false;
13+
14+
export interface BaseWebSocketRequest {
15+
name: string;
16+
}
17+
18+
export type WebSocketRequest = BaseWebSocketRequest & BaseModel;
19+
20+
export const isWebSocketRequest = (model: Pick<BaseModel, 'type'>): model is WebSocketRequest => (
21+
model.type === type
22+
);
23+
24+
export const init = (): BaseWebSocketRequest => ({
25+
name: 'New WebSocket Request',
26+
});
27+
28+
export const migrate = (doc: WebSocketRequest) => doc;
29+
30+
export const create = (patch: Partial<WebSocketRequest> = {}) => {
31+
if (!patch.parentId) {
32+
throw new Error('TODO');
33+
}
34+
return database.docCreate<WebSocketRequest>(type, patch);
35+
};
36+
37+
export const remove = (obj: WebSocketRequest) => database.remove(obj);
38+
39+
export const update = (
40+
obj: WebSocketRequest,
41+
patch: Partial<WebSocketRequest> = {}
42+
) => database.docUpdate(obj, patch);
43+
44+
export const getById = (_id: string) => database.getWhere<WebSocketRequest>(type, { _id });
45+
46+
export const all = () => database.all<WebSocketRequest>(type);

packages/insomnia/src/ui/components/dropdowns/request-group-actions-dropdown.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ export const RequestGroupActionsDropdown = forwardRef<RequestGroupActionsDropdow
4747

4848
const create = useCallback((requestType: CreateRequestType) => {
4949
if (activeWorkspaceId) {
50-
createRequest({ parentId: requestGroup._id, requestType, workspaceId: activeWorkspaceId });
50+
createRequest({
51+
parentId: requestGroup._id,
52+
requestType, workspaceId: activeWorkspaceId,
53+
});
5154
}
5255
}, [activeWorkspaceId, requestGroup._id]);
5356

@@ -143,6 +146,10 @@ export const RequestGroupActionsDropdown = forwardRef<RequestGroupActionsDropdow
143146
<i className="fa fa-plus-circle" />New gRPC Request
144147
</DropdownItem>
145148

149+
<DropdownItem value="WebSocket" onClick={create}>
150+
<i className="fa fa-plus-circle" />WebSocket Request
151+
</DropdownItem>
152+
146153
<DropdownItem onClick={createGroup}>
147154
<i className="fa fa-folder" /> New Folder
148155
<DropdownHint keyBindings={hotKeyRegistry[hotKeyRefs.REQUEST_SHOW_CREATE_FOLDER.id]} />

packages/insomnia/src/ui/components/sidebar/sidebar-create-dropdown.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ export const SidebarCreateDropdown: FC<Props> = ({ right }) => {
5656
<i className="fa fa-plus-circle" />gRPC Request
5757
</DropdownItem>
5858

59+
<DropdownItem value="WebSocket" onClick={create}>
60+
<i className="fa fa-plus-circle" />WebSocket Request
61+
</DropdownItem>
62+
5963
<DropdownItem onClick={createGroup}>
6064
<i className="fa fa-folder" />New Folder
6165
<DropdownHint keyBindings={hotKeyRegistry[hotKeyRefs.REQUEST_SHOW_CREATE_FOLDER.id]} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React, { FC } from 'react';
2+
3+
export const WebSocketRequestPane: FC = () => {
4+
return <div>WebSocket Request</div>;
5+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React, { FC } from 'react';
2+
3+
export const WebSocketResponsePane: FC = () => {
4+
return <div>WebSocket Response</div>;
5+
};

packages/insomnia/src/ui/components/wrapper-debug.tsx

+49-32
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { isGrpcRequest } from '../../models/grpc-request';
55
import { isRemoteProject } from '../../models/project';
66
import { Request, RequestHeader } from '../../models/request';
77
import type { Response } from '../../models/response';
8+
import { isWebSocketRequest } from '../../models/websocket-request';
89
import { isCollection, isDesign } from '../../models/workspace';
910
import { VCS } from '../../sync/vcs/vcs';
1011
import {
@@ -27,6 +28,8 @@ import { RequestPane } from './panes/request-pane';
2728
import { ResponsePane } from './panes/response-pane';
2829
import { SidebarChildren } from './sidebar/sidebar-children';
2930
import { SidebarFilter } from './sidebar/sidebar-filter';
31+
import { WebSocketRequestPane } from './websocket-request-pane';
32+
import { WebSocketResponsePane } from './websocket-response-pane';
3033
import { WorkspacePageHeader } from './workspace-page-header';
3134
import type { HandleActivityChange } from './wrapper';
3235

@@ -114,42 +117,56 @@ export const WrapperDebug: FC<Props> = ({
114117
: null}
115118
renderPaneOne={activeWorkspace ?
116119
<ErrorBoundary showAlert>
117-
{activeRequest && isGrpcRequest(activeRequest) ?
118-
<GrpcRequestPane
119-
activeRequest={activeRequest}
120-
environmentId={activeEnvironment ? activeEnvironment._id : ''}
121-
workspaceId={activeWorkspace._id}
122-
forceRefreshKey={forceRefreshKey}
123-
settings={settings}
124-
/>
125-
:
126-
<RequestPane
127-
environmentId={activeEnvironment ? activeEnvironment._id : ''}
128-
forceRefreshCounter={forceRefreshKey}
129-
forceUpdateRequest={handleForceUpdateRequest}
130-
forceUpdateRequestHeaders={handleForceUpdateRequestHeaders}
131-
handleImport={handleImport}
132-
headerEditorKey={headerEditorKey}
133-
request={activeRequest}
134-
settings={settings}
135-
updateRequestMimeType={handleUpdateRequestMimeType}
136-
workspace={activeWorkspace}
137-
/>}
120+
{activeRequest && (
121+
isGrpcRequest(activeRequest) ? (
122+
<GrpcRequestPane
123+
activeRequest={activeRequest}
124+
environmentId={activeEnvironment ? activeEnvironment._id : ''}
125+
workspaceId={activeWorkspace._id}
126+
forceRefreshKey={forceRefreshKey}
127+
settings={settings}
128+
/>
129+
) : (
130+
isWebSocketRequest(activeRequest) ? (
131+
<WebSocketRequestPane />
132+
) : (
133+
<RequestPane
134+
environmentId={activeEnvironment ? activeEnvironment._id : ''}
135+
forceRefreshCounter={forceRefreshKey}
136+
forceUpdateRequest={handleForceUpdateRequest}
137+
forceUpdateRequestHeaders={handleForceUpdateRequestHeaders}
138+
handleImport={handleImport}
139+
headerEditorKey={headerEditorKey}
140+
request={activeRequest}
141+
settings={settings}
142+
updateRequestMimeType={handleUpdateRequestMimeType}
143+
workspace={activeWorkspace}
144+
/>
145+
)
146+
)
147+
)}
138148
</ErrorBoundary>
139149
: null}
140150
renderPaneTwo={
141151
<ErrorBoundary showAlert>
142-
{activeRequest && isGrpcRequest(activeRequest) ?
143-
<GrpcResponsePane
144-
activeRequest={activeRequest}
145-
forceRefreshKey={forceRefreshKey}
146-
/>
147-
:
148-
<ResponsePane
149-
handleSetFilter={handleSetResponseFilter}
150-
request={activeRequest}
151-
handleSetActiveResponse={handleSetActiveResponse}
152-
/>}
152+
{activeRequest && (
153+
isGrpcRequest(activeRequest) ? (
154+
<GrpcResponsePane
155+
activeRequest={activeRequest}
156+
forceRefreshKey={forceRefreshKey}
157+
/>
158+
) : (
159+
isWebSocketRequest(activeRequest) ? (
160+
<WebSocketResponsePane />
161+
) : (
162+
<ResponsePane
163+
handleSetFilter={handleSetResponseFilter}
164+
request={activeRequest}
165+
handleSetActiveResponse={handleSetActiveResponse}
166+
/>
167+
)
168+
)
169+
)}
153170
</ErrorBoundary>}
154171
/>
155172
);

packages/insomnia/src/ui/hooks/create-request.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export const setActiveRequest = async (
5050
});
5151
};
5252

53-
export type CreateRequestType = 'HTTP' | 'gRPC' | 'GraphQL';
53+
export type CreateRequestType = 'HTTP' | 'gRPC' | 'GraphQL' | 'WebSocket';
5454
type RequestCreator = (input: {
5555
parentId: string;
5656
requestType: CreateRequestType;
@@ -110,6 +110,16 @@ export const createRequest: RequestCreator = async ({
110110
break;
111111
}
112112

113+
case 'WebSocket': {
114+
const request = await models.websocketRequest.create({
115+
parentId,
116+
name: 'New WebSocket Request',
117+
});
118+
models.stats.incrementCreatedRequests();
119+
setActiveRequest(request._id, workspaceId);
120+
break;
121+
}
122+
113123
default:
114124
unreachableCase(
115125
requestType,

packages/insomnia/src/ui/redux/modules/entities.ts

+7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { Stats } from '../../../models/stats';
2727
import { UnitTest } from '../../../models/unit-test';
2828
import { UnitTestResult } from '../../../models/unit-test-result';
2929
import { UnitTestSuite } from '../../../models/unit-test-suite';
30+
import { WebSocketRequest } from '../../../models/websocket-request';
3031
import { Workspace } from '../../../models/workspace';
3132
import { WorkspaceMeta } from '../../../models/workspace-meta';
3233

@@ -70,6 +71,7 @@ export interface EntitiesState {
7071
protoDirectories: EntityRecord<ProtoDirectory>;
7172
grpcRequests: EntityRecord<GrpcRequest>;
7273
grpcRequestMetas: EntityRecord<GrpcRequestMeta>;
74+
websocketRequests: EntityRecord<WebSocketRequest>;
7375
}
7476

7577
export const initialEntitiesState: EntitiesState = {
@@ -98,6 +100,7 @@ export const initialEntitiesState: EntitiesState = {
98100
protoDirectories: {},
99101
grpcRequests: {},
100102
grpcRequestMetas: {},
103+
websocketRequests: {},
101104
};
102105

103106
export function reducer(state = initialEntitiesState, action: any) {
@@ -108,6 +111,9 @@ export function reducer(state = initialEntitiesState, action: any) {
108111

109112
for (const doc of docs) {
110113
const referenceName = getReducerName(doc.type);
114+
if (!(freshState as any)[referenceName]) {
115+
(freshState as any)[referenceName] = {};
116+
}
111117
(freshState as any)[referenceName][doc._id] = doc;
112118
}
113119

@@ -194,5 +200,6 @@ export async function allDocs() {
194200
...(await models.protoDirectory.all()),
195201
...(await models.grpcRequest.all()),
196202
...(await models.grpcRequestMeta.all()),
203+
...(await models.websocketRequest.all()),
197204
];
198205
}

packages/insomnia/src/ui/redux/selectors.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ export const selectActiveWorkspaceEntities = createSelector(
311311

312312
export const selectPinnedRequests = createSelector(selectEntitiesLists, entities => {
313313
const pinned: Record<string, boolean> = {};
314-
const requests = [...entities.requests, ...entities.grpcRequests];
314+
const requests = [...entities.requests, ...entities.grpcRequests, ...entities.websocketRequests];
315315
const requestMetas = [...entities.requestMetas, ...entities.grpcRequestMetas];
316316

317317
// Default all to unpinned
@@ -341,13 +341,20 @@ export const selectActiveRequest = createSelector(
341341
selectActiveWorkspaceMeta,
342342
(entities, workspaceMeta) => {
343343
const id = workspaceMeta?.activeRequestId || 'n/a';
344+
344345
if (id in entities.requests) {
345346
return entities.requests[id];
346-
} else if (id in entities.grpcRequests) {
347+
}
348+
349+
if (id in entities.grpcRequests) {
347350
return entities.grpcRequests[id];
348-
} else {
349-
return null;
350351
}
352+
353+
if (id in entities.websocketRequests) {
354+
return entities.websocketRequests[id];
355+
}
356+
357+
return null;
351358
},
352359
);
353360

0 commit comments

Comments
 (0)