From badd6e243ff04f2223bbb516c69903c72c07ba9d Mon Sep 17 00:00:00 2001 From: Tamlyn Rhodes <tamlyn@tamlyn.org> Date: Mon, 29 Oct 2018 14:53:20 +0000 Subject: [PATCH] fix(server): wait before closing pubsub database connection Add `drain` parameter to `destroy` function to optionally await the `drain` event on the pubsub database client before calling `end`. Expose manager on `pubsweet-server` package root. --- packages/server/src/graphql/pubsub.js | 14 ++++++++++---- packages/server/src/index.js | 1 + packages/server/test/graphql/pubsub_test.js | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 packages/server/test/graphql/pubsub_test.js diff --git a/packages/server/src/graphql/pubsub.js b/packages/server/src/graphql/pubsub.js index f1437b4ea..a79f8bf63 100644 --- a/packages/server/src/graphql/pubsub.js +++ b/packages/server/src/graphql/pubsub.js @@ -42,12 +42,18 @@ module.exports = { return pubsub }, - destroy: () => { - if (client) { + /** + * @param drain {boolean} whether to wait for the database client to emit 'drain' before closing + * @returns {Promise<void>} + */ + destroy: async ({ drain } = {}) => { + if (pubsub) { + if (drain) { + await new Promise(resolve => pubsub.client.on('drain', resolve)) + } + await pubsub.client.end() pubsub = null - return client.end() } - return Promise.resolve() }, /** diff --git a/packages/server/src/index.js b/packages/server/src/index.js index 15712801d..e3a799ca5 100644 --- a/packages/server/src/index.js +++ b/packages/server/src/index.js @@ -8,6 +8,7 @@ module.exports.Collection = require('./models/Collection') module.exports.helpers = require('./helpers/authorization') module.exports.db = require('./db') +module.exports.pubsubManager = require('./graphql/pubsub') module.exports.NotFoundError = require('./errors/NotFoundError') module.exports.startServer = require('./start-server') diff --git a/packages/server/test/graphql/pubsub_test.js b/packages/server/test/graphql/pubsub_test.js new file mode 100644 index 000000000..509555d55 --- /dev/null +++ b/packages/server/test/graphql/pubsub_test.js @@ -0,0 +1,20 @@ +const { getPubsub, destroy } = require('../../src/graphql/pubsub') + +describe('pubsub manager', () => { + afterEach(() => destroy()) + + it('can call destroy before connect', () => + expect(destroy()).resolves.toBeUndefined()) + + it('waits for client to drain before closing', async () => { + const pubsub = await getPubsub() + const cb = jest.fn() + pubsub.subscribe('test_channel', cb) + pubsub.publish('test_channel', { test: 'content' }) + const destroyPromise = destroy({ drain: true }) + + expect(cb).not.toHaveBeenCalled() + await destroyPromise + expect(cb).toHaveBeenCalledWith({ test: 'content' }) + }) +}) -- GitLab