Catch sync errors while starting HTTP server

Reviewed By: lblasa

Differential Revision: D50636260

fbshipit-source-id: f23fb2005c779b87122ae34bfdd9371d8bdec8b4
This commit is contained in:
Andrey Goncharov
2023-10-25 04:52:00 -07:00
committed by Facebook GitHub Bot
parent 97f01d0057
commit 8c5078dc08
2 changed files with 73 additions and 65 deletions

View File

@@ -47,37 +47,41 @@ class ServerRSocket extends ServerWebSocketBase {
start(port: number, sslConfig?: SecureServerConfig): Promise<number> { start(port: number, sslConfig?: SecureServerConfig): Promise<number> {
const self = this; const self = this;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// eslint-disable-next-line prefer-const try {
let rawServer: RSocketServer<any, any> | undefined; // eslint-disable-next-line prefer-const
const serverFactory = (onConnect: (socket: Socket) => void) => { let rawServer: RSocketServer<any, any> | undefined;
const transportServer = sslConfig const serverFactory = (onConnect: (socket: Socket) => void) => {
? tls.createServer(sslConfig, (socket) => { const transportServer = sslConfig
onConnect(socket); ? tls.createServer(sslConfig, (socket) => {
}) onConnect(socket);
: net.createServer(onConnect); })
transportServer.on('error', reject).on('listening', () => { : net.createServer(onConnect);
console.debug( transportServer.on('error', reject).on('listening', () => {
`${ console.debug(
sslConfig ? 'Secure' : 'Certificate' `${
} server started on port ${port}`, sslConfig ? 'Secure' : 'Certificate'
'server', } server started on port ${port}`,
); 'server',
self.listener.onListening(port); );
self.rawServer_ = rawServer; self.listener.onListening(port);
resolve((transportServer.address() as AddressInfo).port); self.rawServer_ = rawServer;
resolve((transportServer.address() as AddressInfo).port);
});
return transportServer;
};
rawServer = new RSocketServer({
getRequestHandler: sslConfig
? this._trustedRequestHandler
: this._untrustedRequestHandler,
transport: new RSocketTCPServer({
port: port,
serverFactory: serverFactory,
}),
}); });
return transportServer; rawServer.start();
}; } catch (e) {
rawServer = new RSocketServer({ reject(e);
getRequestHandler: sslConfig }
? this._trustedRequestHandler
: this._untrustedRequestHandler,
transport: new RSocketTCPServer({
port: port,
serverFactory: serverFactory,
}),
});
rawServer.start();
}); });
} }

View File

@@ -49,46 +49,50 @@ class ServerWebSocket extends ServerWebSocketBase {
async start(port: number, sslConfig?: SecureServerConfig): Promise<number> { async start(port: number, sslConfig?: SecureServerConfig): Promise<number> {
const assignedPort = await new Promise<number>((resolve, reject) => { const assignedPort = await new Promise<number>((resolve, reject) => {
const server = sslConfig try {
? createHttpsServer(sslConfig) const server = sslConfig
: createHttpServer(); ? createHttpsServer(sslConfig)
: createHttpServer();
const wsServer = new WSServer({ const wsServer = new WSServer({
server, server,
verifyClient: this.verifyClient(), verifyClient: this.verifyClient(),
maxPayload: WEBSOCKET_MAX_MESSAGE_SIZE, 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
// https://github.com/websockets/ws/blob/a3a22e4ed39c1a3be8e727e9c630dd440edc61dd/lib/websocket-server.js#L109 // https://github.com/websockets/ws/blob/a3a22e4ed39c1a3be8e727e9c630dd440edc61dd/lib/websocket-server.js#L109
const onConnectionError = (error: Error) => { const onConnectionError = (error: Error) => {
reject( reject(
new Error( new Error(
`Unable to start server at port ${port} due to ${JSON.stringify( `Unable to start server at port ${port} due to ${JSON.stringify(
serializeError(error), serializeError(error),
)}`, )}`,
), ),
); );
}; };
wsServer.once('error', onConnectionError); wsServer.once('error', onConnectionError);
server.listen(port, () => { server.listen(port, () => {
console.debug( console.debug(
`[ws] ${ `[ws] ${
sslConfig ? 'Secure' : 'Insecure' sslConfig ? 'Secure' : 'Insecure'
} server started on port ${port}`, } server started on port ${port}`,
'server', 'server',
); );
// Unsubscribe connection error listener. // Unsubscribe connection error listener.
// We'll attach a permanent error listener later. // We'll attach a permanent error listener later.
wsServer.off('error', onConnectionError); wsServer.off('error', onConnectionError);
this.listener.onListening(port); this.listener.onListening(port);
this.wsServer = wsServer; this.wsServer = wsServer;
this.httpServer = server; this.httpServer = server;
resolve((server.address() as AddressInfo).port); resolve((server.address() as AddressInfo).port);
}); });
} catch (e) {
reject(e);
}
}); });
assertNotNull(this.wsServer); assertNotNull(this.wsServer);