Skip to content

Commit da69616

Browse files
committed
CompileRequest from frontend works
1 parent 0fbae53 commit da69616

File tree

9 files changed

+1371
-1158
lines changed

9 files changed

+1371
-1158
lines changed

ui/frontend/actions.ts

Lines changed: 68 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,14 @@ export enum ActionType {
135135
WebSocketConnected = 'WEBSOCKET_CONNECTED',
136136
WebSocketDisconnected = 'WEBSOCKET_DISCONNECTED',
137137
WebSocketFeatureFlagEnabled = 'WEBSOCKET_FEATURE_FLAG_ENABLED',
138+
WSRequest = 'WS_REQUEST',
139+
WSResponse = 'WS_RESPONSE',
140+
WSStdoutPacket = 'WS_STDOUT_PACKET',
141+
WSStderrPacket = 'WS_STDERR_PACKET',
138142
WSExecuteRequest = 'WS_EXECUTE_REQUEST',
139143
WSExecuteResponse = 'WS_EXECUTE_RESPONSE',
144+
WSCompileRequest = 'WS_COMPILE_REQUEST',
145+
WSCompileResponse = 'WS_COMPILE_RESPONSE',
140146
}
141147

142148
export const WebSocketError = z.object({
@@ -159,6 +165,16 @@ export const WSExecuteResponse = z.object({
159165
});
160166
export type WSExecuteResponse = z.infer<typeof WSExecuteResponse>;
161167

168+
export const WSCompileResponse = z.object({
169+
type: z.literal(ActionType.WSCompileResponse),
170+
success: z.boolean(),
171+
code: z.string(),
172+
stdout: z.string(),
173+
stderr: z.string(),
174+
extra: ExecuteExtra,
175+
});
176+
export type WSCompileResponse = z.infer<typeof WSCompileResponse>;
177+
162178
export const initializeApplication = () => createAction(ActionType.InitializeApplication);
163179

164180
export const disableSyncChangesToStorage = () => createAction(ActionType.DisableSyncChangesToStorage);
@@ -363,8 +379,6 @@ function performCompileShow(
363379
}): ThunkAction {
364380
// TODO: Check a cache
365381
return function(dispatch, getState) {
366-
dispatch(request());
367-
368382
const state = getState();
369383
const code = codeSelector(state);
370384
const { configuration: {
@@ -378,23 +392,29 @@ function performCompileShow(
378392
const crateType = getCrateType(state);
379393
const tests = runAsTest(state);
380394
const backtrace = state.configuration.backtrace === Backtrace.Enabled;
381-
const body: CompileRequestBody = {
382-
channel,
383-
mode,
384-
edition,
385-
crateType,
386-
tests,
387-
code,
388-
target,
389-
assemblyFlavor,
390-
demangleAssembly,
391-
processAssembly,
392-
backtrace,
393-
};
394395

395-
return jsonPost<CompileResponseBody>(routes.compile, body)
396-
.then(json => dispatch(success(json)))
397-
.catch(json => dispatch(failure(json)));
396+
if (useWebsocketSelector(state)) {
397+
return dispatch(wsCompileRequest(channel, mode, edition, crateType, tests, code, target, assemblyFlavor, demangleAssembly, processAssembly, backtrace));
398+
} else {
399+
dispatch(request());
400+
const body: CompileRequestBody = {
401+
channel,
402+
mode,
403+
edition,
404+
crateType,
405+
tests,
406+
code,
407+
target,
408+
assemblyFlavor,
409+
demangleAssembly,
410+
processAssembly,
411+
backtrace,
412+
};
413+
414+
return jsonPost<CompileResponseBody>(routes.compile, body)
415+
.then(json => dispatch(success(json)))
416+
.catch(json => dispatch(failure(json)));
417+
}
398418
};
399419
}
400420

@@ -526,6 +546,34 @@ const wsExecuteRequest = (
526546
extra: makeExtra(),
527547
});
528548

549+
const wsCompileRequest = (
550+
channel: Channel,
551+
mode: Mode,
552+
edition: Edition,
553+
crateType: string,
554+
tests: boolean,
555+
code: string,
556+
target: string,
557+
assemblyFlavor: AssemblyFlavor,
558+
demangleAssembly: DemangleAssembly,
559+
processAssembly: ProcessAssembly,
560+
backtrace: boolean
561+
) =>
562+
createAction(ActionType.WSCompileRequest, {
563+
channel,
564+
mode,
565+
edition,
566+
crateType,
567+
tests,
568+
code,
569+
target,
570+
assemblyFlavor,
571+
demangleAssembly,
572+
processAssembly,
573+
backtrace,
574+
extra: makeExtra(),
575+
});
576+
529577
export const performPrimaryAction = (): ThunkAction => (dispatch, getState) => {
530578
const state = getState();
531579
const primaryAction = PRIMARY_ACTIONS[state.configuration.primaryAction];
@@ -1036,5 +1084,7 @@ export type Action =
10361084
| ReturnType<typeof websocketDisconnected>
10371085
| ReturnType<typeof websocketFeatureFlagEnabled>
10381086
| ReturnType<typeof wsExecuteRequest>
1087+
| ReturnType<typeof wsCompileRequest>
10391088
| WSExecuteResponse
1089+
| WSCompileResponse
10401090
;

ui/frontend/reducers/output/mir.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const DEFAULT: State = {
66
};
77

88
interface State {
9+
sequenceNumber?: number;
910
requestsInProgress: number;
1011
code?: string;
1112
stdout?: string;
@@ -23,6 +24,26 @@ export default function mir(state = DEFAULT, action: Action) {
2324
}
2425
case ActionType.CompileMirFailed:
2526
return finish(state, { error: action.error });
27+
case ActionType.WSCompileRequest: {
28+
const { extra: { sequenceNumber } } = action;
29+
if (sequenceNumber >= (state.sequenceNumber ?? 0)) {
30+
const requestsInProgress = 1; // Only tracking one request
31+
return {...state, sequenceNumber, requestsInProgress };
32+
} else {
33+
return state;
34+
}
35+
}
36+
case ActionType.WSCompileResponse: {
37+
const { code, stdout, stderr, extra: { sequenceNumber } } = action;
38+
39+
if (sequenceNumber >= (state.sequenceNumber ?? 0)) {
40+
const requestsInProgress = 0; // Only tracking one request
41+
return { ...state, code, stdout, stderr, requestsInProgress };
42+
} else {
43+
return state;
44+
}
45+
}
46+
2647
default:
2748
return state;
2849
}

ui/frontend/websocketMiddleware.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,26 @@ import { z } from 'zod';
44
import {
55
ActionType,
66
WSExecuteResponse,
7+
WSCompileResponse,
78
WebSocketError,
89
websocketConnected,
910
websocketDisconnected,
1011
websocketError,
1112
} from './actions';
1213

13-
const WSMessageResponse = z.discriminatedUnion('type', [WebSocketError, WSExecuteResponse]);
14+
const WSResponse = z.object({
15+
type: z.literal(ActionType.WSResponse),
16+
response: z.discriminatedUnion('type', [WSExecuteResponse, WSCompileResponse])
17+
});
18+
const WSStdoutPacket = z.object({
19+
type: z.literal(ActionType.WSStdoutPacket),
20+
stdout_packet: z.string()
21+
});
22+
const WSStderrPacket = z.object({
23+
type: z.literal(ActionType.WSStderrPacket),
24+
stderr_packet: z.string()
25+
});
26+
const WSServerMessage = z.discriminatedUnion('type', [WSResponse, WSStdoutPacket, WSStderrPacket]);
1427

1528
const reportWebSocketError = async (error: string) => {
1629
try {
@@ -75,6 +88,14 @@ export const websocketMiddleware =
7588

7689
socket.addEventListener('open', () => {
7790
store.dispatch(websocketConnected());
91+
// const params = new URLSearchParams(window.location.search);
92+
if (socket != null) {
93+
// if (params.has("pool")) {
94+
socket.send("use container pool");
95+
// } else {
96+
// socket.send("use no pool");
97+
// }
98+
}
7899

79100
wasConnected = true;
80101
});
@@ -101,8 +122,10 @@ export const websocketMiddleware =
101122
socket.addEventListener('message', (event) => {
102123
try {
103124
const rawMessage = JSON.parse(event.data);
104-
const message = WSMessageResponse.parse(rawMessage);
105-
store.dispatch(message);
125+
const message = WSServerMessage.parse(rawMessage);
126+
if (message.type == ActionType.WSResponse) {
127+
store.dispatch(message.response);
128+
}
106129
resetTimeout();
107130
} catch (e) {
108131
console.log('Unable to parse WebSocket message', event.data, e);
@@ -127,7 +150,11 @@ export const websocketMiddleware =
127150

128151
return (next) => (action) => {
129152
if (socket && socket.readyState == socket.OPEN && sendActionOnWebsocket(action)) {
130-
const message = JSON.stringify(action);
153+
console.log(action);
154+
const request = {
155+
Request: action
156+
};
157+
const message = JSON.stringify(request);
131158
socket.send(message);
132159
resetTimeout();
133160
}
@@ -136,4 +163,4 @@ export const websocketMiddleware =
136163
};
137164
};
138165

139-
const sendActionOnWebsocket = (action: any): boolean => action.type === ActionType.WSExecuteRequest;
166+
const sendActionOnWebsocket = (action: any): boolean => action.type === ActionType.WSExecuteRequest || action.type === ActionType.WSCompileRequest;

0 commit comments

Comments
 (0)