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:
committed by
Facebook Github Bot
parent
84a8b1acab
commit
ecd6935d18
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user