Make flipper-server-client gracefully handle malformed messages

Summary: FlipperServerClient can use any socket to transfer the data. Since we do not control the socket, we cannot guarantee what comes out of it (hello, Jest E2E tunnel!). We need to handle unexpected messages gracefully.

Reviewed By: passy

Differential Revision: D40891384

fbshipit-source-id: 6f873037aa49bac3fc4c09fa49483cdec537ae40
This commit is contained in:
Andrey Goncharov
2022-11-03 06:57:17 -07:00
committed by Facebook GitHub Bot
parent 60a439ef7b
commit 2a108854d2

View File

@@ -84,50 +84,57 @@ export function createFlipperServerWithSocket(
});
socket.addEventListener('message', ({data}) => {
const {event, payload} = JSON.parse(
data.toString(),
) as ServerWebSocketMessage;
try {
const {event, payload} = JSON.parse(
data.toString(),
) as ServerWebSocketMessage;
switch (event) {
case 'exec-response': {
console.debug('flipper-server: exec <<<', payload);
const entry = pendingRequests.get(payload.id);
if (!entry) {
console.warn(`Unknown request id `, payload.id);
} else {
pendingRequests.delete(payload.id);
clearTimeout(entry.timeout);
entry.resolve(payload.data);
switch (event) {
case 'exec-response': {
console.debug('flipper-server: exec <<<', payload);
const entry = pendingRequests.get(payload.id);
if (!entry) {
console.warn(`Unknown request id `, payload.id);
} else {
pendingRequests.delete(payload.id);
clearTimeout(entry.timeout);
entry.resolve(payload.data);
}
break;
}
break;
}
case 'exec-response-error': {
// TODO: Deserialize error
console.debug(
'flipper-server: exec <<< [SERVER ERROR]',
payload.id,
payload.data,
);
const entry = pendingRequests.get(payload.id);
if (!entry) {
console.warn(`flipper-server: Unknown request id `, payload.id);
} else {
pendingRequests.delete(payload.id);
clearTimeout(entry.timeout);
entry.reject(payload.data);
case 'exec-response-error': {
// TODO: Deserialize error
console.debug(
'flipper-server: exec <<< [SERVER ERROR]',
payload.id,
payload.data,
);
const entry = pendingRequests.get(payload.id);
if (!entry) {
console.warn(`flipper-server: Unknown request id `, payload.id);
} else {
pendingRequests.delete(payload.id);
clearTimeout(entry.timeout);
entry.reject(payload.data);
}
break;
}
case 'server-event': {
eventEmitter.emit(payload.event, payload.data);
break;
}
default: {
console.warn(
'flipper-server: received unknown message type',
data.toString(),
);
}
break;
}
case 'server-event': {
eventEmitter.emit(payload.event, payload.data);
break;
}
default: {
console.warn(
'flipper-server: received unknown message type',
data.toString(),
);
}
} catch (e) {
console.warn(
'flipper-server: failed to process message',
data.toString(),
);
}
});