Use uniform Socket message size to avoid disconnects

Summary: During startup the socket connection would close a few times, among others because Scribe dumps 1.3 MB of data after startup, and the maximum payload of `socket.io` defaults to 1MB. This diff changes it to 100MB (the max size used by `ws` library). We know that we need at least > 10 MB, as that is what plugins like Network cap at.

Reviewed By: aigoncharov

Differential Revision: D33017653

fbshipit-source-id: 1233af6fbdc4b9eed42786ee418cfd6d43b2b433
This commit is contained in:
Michel Weststrate
2021-12-13 05:46:42 -08:00
committed by Facebook GitHub Bot
parent accef856fc
commit 3ef1923b29
4 changed files with 22 additions and 6 deletions

View File

@@ -35,6 +35,10 @@ export interface ConnectionCtx {
request: IncomingMessage; request: IncomingMessage;
} }
// based on https://github.com/websockets/ws/blob/master/lib/websocket-server.js#L40,
// exposed to share with socket.io defaults
export const WEBSOCKET_MAX_MESSAGE_SIZE = 100 * 1024 * 1024;
/** /**
* It serves as a base class for WebSocket based servers. It delegates the 'connection' * It serves as a base class for WebSocket based servers. It delegates the 'connection'
* event to subclasses as a customisation point. * event to subclasses as a customisation point.
@@ -52,6 +56,7 @@ class ServerWebSocket extends ServerAdapter {
const wsServer = new WSServer({ const wsServer = new WSServer({
server, server,
verifyClient: this.verifyClient(), verifyClient: this.verifyClient(),
maxPayload: WEBSOCKET_MAX_MESSAGE_SIZE,
}); });
// We do not need to listen to http server's `error` because it is propagated to WS // We do not need to listen to http server's `error` because it is propagated to WS

View File

@@ -26,3 +26,5 @@ export function getGatekeepers(username: string): Record<string, boolean> {
} }
return GKImplementation.allGKs(); return GKImplementation.allGKs();
} }
export {WEBSOCKET_MAX_MESSAGE_SIZE} from './comms/ServerWebSocket';

View File

@@ -12,6 +12,7 @@ import http from 'http';
import path from 'path'; import path from 'path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import socketio from 'socket.io'; import socketio from 'socket.io';
import {WEBSOCKET_MAX_MESSAGE_SIZE} from 'flipper-server-core';
type Config = { type Config = {
port: number; port: number;
@@ -61,6 +62,8 @@ function startAssetServer(
} }
function addWebsocket(server: http.Server) { function addWebsocket(server: http.Server) {
const io = new socketio.Server(server); const io = new socketio.Server(server, {
maxHttpBufferSize: WEBSOCKET_MAX_MESSAGE_SIZE,
});
return io; return io;
} }

View File

@@ -138,7 +138,10 @@ function launchServer() {
} }
async function restartServer() { async function restartServer() {
proc?.kill(9); if (proc) {
proc.kill(9);
await sleep(1000);
}
try { try {
await compileServerMain(); await compileServerMain();
await launchServer(); await launchServer();
@@ -196,10 +199,13 @@ async function startWatchChanges() {
await restartServer(); await restartServer();
if (argv.open) { if (argv.open) {
setTimeout(() => { await sleep(2000);
// TODO: make port configurable together with flipper-server // TODO: make port configurable together with flipper-server
open('http://localhost:52342/index.web.dev.html'); open('http://localhost:52342/index.web.dev.html');
}, 2000);
} }
} }
})(); })();
function sleep(ms: number) {
return new Promise((r) => setTimeout(r, ms));
}