diff --git a/spec/ParseServer.spec.js b/spec/ParseServer.spec.js index f264571f..00d7b347 100644 --- a/spec/ParseServer.spec.js +++ b/spec/ParseServer.spec.js @@ -62,6 +62,7 @@ describe('Server Url Checks', () => { collectionPrefix: 'test_', }); } + let close = false; const newConfiguration = Object.assign({}, defaultConfiguration, { databaseAdapter, serverStartComplete: () => { @@ -71,10 +72,14 @@ describe('Server Url Checks', () => { done.fail('Close Server Error'); } reconfigureServer({}).then(() => { + expect(close).toBe(true); done(); }); }); }, + serverCloseComplete: () => { + close = true; + }, }); const parseServer = ParseServer.start(newConfiguration); }); diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js index 27fad63f..dea72183 100644 --- a/src/Options/Definitions.js +++ b/src/Options/Definitions.js @@ -330,6 +330,14 @@ module.exports.ParseServerOptions = { action: parsers.numberParser('schemaCacheTTL'), default: 5000, }, + serverCloseComplete: { + env: 'PARSE_SERVER_SERVER_CLOSE_COMPLETE', + help: 'Callback when server has closed', + }, + serverStartComplete: { + env: 'PARSE_SERVER_SERVER_START_COMPLETE', + help: 'Callback when server has started', + }, serverURL: { env: 'PARSE_SERVER_URL', help: 'URL to your parse server with http:// or https://.', diff --git a/src/Options/docs.js b/src/Options/docs.js index 1ecd8616..b5e13042 100644 --- a/src/Options/docs.js +++ b/src/Options/docs.js @@ -59,6 +59,8 @@ * @property {Boolean} revokeSessionOnPasswordReset When a user changes their password, either through the reset password email or while logged in, all sessions are revoked if this is true. Set to false if you don't want to revoke sessions. * @property {Boolean} scheduledPush Configuration for push scheduling, defaults to false. * @property {Number} schemaCacheTTL The TTL for caching the schema for optimizing read/write operations. You should put a long TTL when your DB is in production. default to 5000; set 0 to disable. + * @property {Function} serverCloseComplete Callback when server has closed + * @property {Function} serverStartComplete Callback when server has started * @property {String} serverURL URL to your parse server with http:// or https://. * @property {Number} sessionLength Session duration, in seconds, defaults to 1 year * @property {Boolean} silent Disables console output diff --git a/src/Options/index.js b/src/Options/index.js index e4875098..b3ebc2f8 100644 --- a/src/Options/index.js +++ b/src/Options/index.js @@ -199,8 +199,10 @@ export interface ParseServerOptions { :ENV: PARSE_SERVER_PLAYGROUND_PATH :DEFAULT: /playground */ playgroundPath: ?string; - + /* Callback when server has started */ serverStartComplete: ?(error: ?Error) => void; + /* Callback when server has closed */ + serverCloseComplete: ?() => void; } export interface CustomPagesOptions { diff --git a/src/ParseServer.js b/src/ParseServer.js index 7c851713..b4e4cbdc 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -89,7 +89,6 @@ class ParseServer { if (serverStartComplete) { serverStartComplete(error); } else { - // eslint-disable-next-line no-console console.error(error); process.exit(1); } @@ -119,10 +118,18 @@ class ParseServer { if (adapter && typeof adapter.handleShutdown === 'function') { const promise = adapter.handleShutdown(); if (promise instanceof Promise) { - return promise; + return promise.then(() => { + if (this.config.serverCloseComplete) { + this.config.serverCloseComplete(); + } + }); } } - return Promise.resolve(); + return Promise.resolve().then(() => { + if (this.config.serverCloseComplete) { + this.config.serverCloseComplete(); + } + }); } /**