Catch sync errors while starting HTTP server
Reviewed By: lblasa Differential Revision: D50636260 fbshipit-source-id: f23fb2005c779b87122ae34bfdd9371d8bdec8b4
This commit is contained in:
committed by
Facebook GitHub Bot
parent
97f01d0057
commit
8c5078dc08
@@ -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();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user