Promisify server starting

Summary:
We had a promise for initializing the servers, but it wasn't rejected when server startup failed.
Fixed by resolving / rejecting based on the listen / error events fired from the server.

Reviewed By: passy

Differential Revision: D13762580

fbshipit-source-id: a0d1a56473f84dc416e5ce2de91a53b21574f452
This commit is contained in:
John Knox
2019-01-23 05:15:56 -08:00
committed by Facebook Github Bot
parent 84a8b1acab
commit ecd6935d18
2 changed files with 53 additions and 39 deletions

View File

@@ -40,8 +40,8 @@ type ClientInfo = {|
export default class Server extends EventEmitter {
connections: Map<string, ClientInfo>;
secureServer: RSocketServer;
insecureServer: RSocketServer;
secureServer: Promise<RSocketServer>;
insecureServer: Promise<RSocketServer>;
certificateProvider: CertificateProvider;
connectionTracker: ConnectionTracker;
logger: Logger;
@@ -75,42 +75,49 @@ export default class Server extends EventEmitter {
return this.initialisePromise;
}
startServer(port: number, sslConfig?: SecureServerConfig) {
startServer(
port: number,
sslConfig?: SecureServerConfig,
): Promise<RSocketServer> {
const server = this;
const serverFactory = onConnect => {
const transportServer = sslConfig
? tls.createServer(sslConfig, socket => {
onConnect(socket);
return new Promise((resolve, reject) => {
let rsServer;
const serverFactory = onConnect => {
const transportServer = sslConfig
? tls.createServer(sslConfig, socket => {
onConnect(socket);
})
: net.createServer(onConnect);
transportServer
.on('error', err => {
server.emit('error', err);
console.error(`Error opening server on port ${port}`, 'server');
reject(err);
})
: net.createServer(onConnect);
transportServer
.on('error', err => {
server.emit('error', err);
console.error(`Error opening server on port ${port}`, 'server');
})
.on('listening', () => {
console.debug(
`${
sslConfig ? 'Secure' : 'Certificate'
} server started on port ${port}`,
'server',
);
server.emit('listening', port);
});
return transportServer;
};
const rsServer = new RSocketServer({
getRequestHandler: sslConfig
? this._trustedRequestHandler
: this._untrustedRequestHandler,
transport: new RSocketTCPServer({
port: port,
serverFactory: serverFactory,
}),
});
.on('listening', () => {
console.debug(
`${
sslConfig ? 'Secure' : 'Certificate'
} server started on port ${port}`,
'server',
);
server.emit('listening', port);
resolve(rsServer);
});
return transportServer;
};
rsServer.start();
return rsServer;
rsServer = new RSocketServer({
getRequestHandler: sslConfig
? this._trustedRequestHandler
: this._untrustedRequestHandler,
transport: new RSocketTCPServer({
port: port,
serverFactory: serverFactory,
}),
});
rsServer.start();
});
}
_trustedRequestHandler = (conn: RSocket, connectRequest: {data: string}) => {
@@ -244,8 +251,10 @@ export default class Server extends EventEmitter {
close(): Promise<void> {
if (this.initialisePromise) {
return this.initialisePromise.then(_ => {
this.secureServer.stop();
this.insecureServer.stop();
return Promise.all([
this.secureServer.then(server => server.stop()),
this.insecureServer.then(server => server.stop()),
]).then(() => undefined);
});
}
return Promise.resolve();