From 764cdfe127354e5899396a79c98dffaef117b455 Mon Sep 17 00:00:00 2001 From: John Knox Date: Mon, 22 Oct 2018 11:36:06 -0700 Subject: [PATCH] Move async work out of the Server constructor Summary: I feel like doing async stuff here isn't a good idea in general. But more pressingly, it means you can't immediately call server.close() after new Server(), because the things to close haven't been created yet. Reviewed By: danielbuechele Differential Revision: D10488301 fbshipit-source-id: 76ebe91e0c09f353e0bdb9f2e4116757e757abb2 --- src/__tests__/server.electron.js | 1 + src/dispatcher/server.js | 1 + src/server.js | 23 ++++++++++++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/__tests__/server.electron.js b/src/__tests__/server.electron.js index 557bd4751..ba8a54387 100644 --- a/src/__tests__/server.electron.js +++ b/src/__tests__/server.electron.js @@ -24,6 +24,7 @@ beforeAll(() => { } server = new Server(new LogManager(), mockStore); + return server.init(); }); test('servers starting at ports', done => { diff --git a/src/dispatcher/server.js b/src/dispatcher/server.js index dda29807d..dd4fa66a7 100644 --- a/src/dispatcher/server.js +++ b/src/dispatcher/server.js @@ -13,6 +13,7 @@ import type Client from '../Client.js'; export default (store: Store, logger: Logger) => { const server = new Server(logger, store); + server.init(); server.addListener('new-client', (client: Client) => { store.dispatch({ diff --git a/src/server.js b/src/server.js index f07018b20..2608330a0 100644 --- a/src/server.js +++ b/src/server.js @@ -44,6 +44,7 @@ export default class Server extends EventEmitter { connectionTracker: ConnectionTracker; logger: Logger; store: Store; + initialisePromise: Promise; constructor(logger: Logger, store: Store) { super(); @@ -52,7 +53,6 @@ export default class Server extends EventEmitter { this.certificateProvider = new CertificateProvider(this, logger); this.connectionTracker = new ConnectionTracker(logger); this.store = store; - this.init(); } on: ((event: 'new-client', callback: (client: Client) => void) => void) & @@ -60,12 +60,16 @@ export default class Server extends EventEmitter { ((event: 'clients-change', callback: () => void) => void); init() { - this.certificateProvider + this.initialisePromise = this.certificateProvider .loadSecureServerConfig() .then( options => (this.secureServer = this.startServer(SECURE_PORT, options)), - ); - this.insecureServer = this.startServer(INSECURE_PORT); + ) + .then(() => { + this.insecureServer = this.startServer(INSECURE_PORT); + return; + }); + return this.initialisePromise; } startServer(port: number, sslConfig?: SecureServerConfig) { @@ -232,9 +236,14 @@ export default class Server extends EventEmitter { }; }; - close() { - this.secureServer.stop(); - this.insecureServer.stop(); + close(): Promise { + if (this.initialisePromise) { + return this.initialisePromise.then(_ => { + this.secureServer.stop(); + this.insecureServer.stop(); + }); + } + return Promise.resolve(); } toJSON() {