From 2a108854d204304b136d47de9e3bfe6d8e6a26fa Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Thu, 3 Nov 2022 06:57:17 -0700 Subject: [PATCH] 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 --- .../src/FlipperServerClient.tsx | 87 ++++++++++--------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/desktop/flipper-server-client/src/FlipperServerClient.tsx b/desktop/flipper-server-client/src/FlipperServerClient.tsx index d7d6494f0..96574a351 100644 --- a/desktop/flipper-server-client/src/FlipperServerClient.tsx +++ b/desktop/flipper-server-client/src/FlipperServerClient.tsx @@ -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(), + ); } });