From affd6c0b6a70e45d61f78a1165f353c610c80cc1 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 7 Feb 2018 09:33:01 -0800 Subject: [PATCH 1/5] Refactored `waitUntilReady()` The current `waitUntilReady()` method will never resolve if the 'ready' event fires after the client's code is run. This implementation will maintain the state of the promise and will always resolve even after the 'ready' event was emitted. --- src/index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 937f12b5..3b1168d2 100644 --- a/src/index.js +++ b/src/index.js @@ -34,6 +34,8 @@ var flushInterval = 2000; var seenRequests = {}; +var ldPromise = Promise.reject('LaunchDarkly is not ready'); + function sendIdentifyEvent(user) { enqueueEvent({ kind: 'identify', @@ -82,9 +84,7 @@ function sendGoalEvent(kind, goal) { } function waitUntilReady() { - return new Promise(function(resolve) { - client.on('ready', resolve); - }); + return ldPromise; } function identify(user, hash, onDone) { @@ -391,6 +391,10 @@ function initialize(env, user, options) { return client; } +client.on('ready', function () { + ldPromise = Promise.resolve(client); +}); + module.exports = { initialize: initialize }; From fd4f83f7b99c6e56b49e52bbca5abba3a80ecea6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 7 Feb 2018 09:37:37 -0800 Subject: [PATCH 2/5] fixup! Refactored `waitUntilReady()` --- src/index.js | 2 +- src/messages.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 3b1168d2..da6674c1 100644 --- a/src/index.js +++ b/src/index.js @@ -34,7 +34,7 @@ var flushInterval = 2000; var seenRequests = {}; -var ldPromise = Promise.reject('LaunchDarkly is not ready'); +var ldPromise = Promise.reject(messages.clientNotReady()); function sendIdentifyEvent(user) { enqueueEvent({ diff --git a/src/messages.js b/src/messages.js index 86086f8f..f68eba3c 100644 --- a/src/messages.js +++ b/src/messages.js @@ -1,4 +1,7 @@ module.exports ={ + clientNotReady: function() { + return 'LaunchDarkly client is not ready'; + }, invalidKey: function() { return 'Event key must be a string'; }, From bffb8d4adc4c94cb92901fb5a5031e41d3fd2731 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 7 Feb 2018 09:53:33 -0800 Subject: [PATCH 3/5] fixup! Refactored `waitUntilReady()` --- src/__tests__/LDClient-test.js | 16 ++++++++++++++++ src/index.js | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/__tests__/LDClient-test.js b/src/__tests__/LDClient-test.js index 00cefe7a..79defd50 100644 --- a/src/__tests__/LDClient-test.js +++ b/src/__tests__/LDClient-test.js @@ -71,6 +71,22 @@ describe('LDClient', function() { }); }); + it('should resolve waitUntilReady promise when ready after ready event was already emitted', function(done) { + var user = {key: 'user'}; + var handleReady = sinon.spy(); + var client = LDClient.initialize('UNKNOWN_ENVIRONMENT_ID', user, { + bootstrap: {} + }); + setTimeout(function () { + client.waitUntilReady().then(handleReady); + setTimeout(function () { + expect(handleReady.called).to.be.true; + done(); + }, 0); + }, 1000); + }); + + it('should log an error when initialize is called without an environment key', function(done) { var user = {key: 'user'}; var errorSpy = sinon.spy(console, 'error'); diff --git a/src/index.js b/src/index.js index da6674c1..f14c9946 100644 --- a/src/index.js +++ b/src/index.js @@ -388,13 +388,13 @@ function initialize(env, user, options) { window.addEventListener('message', handleMessage); + client.on('ready', function () { + ldPromise = Promise.resolve(client); + }); + return client; } -client.on('ready', function () { - ldPromise = Promise.resolve(client); -}); - module.exports = { initialize: initialize }; From bb26f17afd426478aac91fa13a230c0a86da42f6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 7 Feb 2018 09:56:13 -0800 Subject: [PATCH 4/5] fixup! Refactored `waitUntilReady()` --- src/__tests__/LDClient-test.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/__tests__/LDClient-test.js b/src/__tests__/LDClient-test.js index 79defd50..260010fe 100644 --- a/src/__tests__/LDClient-test.js +++ b/src/__tests__/LDClient-test.js @@ -71,15 +71,21 @@ describe('LDClient', function() { }); }); - it('should resolve waitUntilReady promise when ready after ready event was already emitted', function(done) { - var user = {key: 'user'}; + it('should resolve waitUntilReady promise after ready event was already emitted', function(done) { + var user = { key: 'user' }; + var handleInitialReady = sinon.spy(); var handleReady = sinon.spy(); var client = LDClient.initialize('UNKNOWN_ENVIRONMENT_ID', user, { bootstrap: {} }); + + client.on('ready', handleInitialReady); + setTimeout(function () { client.waitUntilReady().then(handleReady); + setTimeout(function () { + expect(handleInitialReady.called).to.be.true; expect(handleReady.called).to.be.true; done(); }, 0); From a686dfbaad3e95aba5e06d2cf218dbc0a1c20a0f Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 7 Feb 2018 10:04:51 -0800 Subject: [PATCH 5/5] fixup! Refactored `waitUntilReady()` --- src/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index f14c9946..a336da3f 100644 --- a/src/index.js +++ b/src/index.js @@ -388,8 +388,9 @@ function initialize(env, user, options) { window.addEventListener('message', handleMessage); - client.on('ready', function () { + var onReady = client.on('ready', function () { ldPromise = Promise.resolve(client); + client.off(onReady); }); return client;