From 6f83638ab6137b73873daae3991bad652bee84cf Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Wed, 15 May 2019 16:14:23 -0700 Subject: [PATCH 1/4] Clear timeout when ready promise fulfills --- packages/optimizely-sdk/lib/optimizely/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/optimizely-sdk/lib/optimizely/index.js b/packages/optimizely-sdk/lib/optimizely/index.js index 18927ccaa..daf14ae16 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.js +++ b/packages/optimizely-sdk/lib/optimizely/index.js @@ -936,6 +936,11 @@ Optimizely.prototype.onReady = function(options) { onClose: onClose, }; + this.__readyPromise.then(function() { + clearTimeout(readyTimeout); + delete this.__readyTimeouts[timeoutId]; + }.bind(this)); + return Promise.race([this.__readyPromise, timeoutPromise]); }; From 3deeccaea0e120a080bd1f058418bbd243f7d560 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Wed, 15 May 2019 16:29:31 -0700 Subject: [PATCH 2/4] Also resolve the timeout promise when clearing the timeout --- packages/optimizely-sdk/lib/optimizely/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/optimizely-sdk/lib/optimizely/index.js b/packages/optimizely-sdk/lib/optimizely/index.js index daf14ae16..23f0577e7 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.js +++ b/packages/optimizely-sdk/lib/optimizely/index.js @@ -939,6 +939,9 @@ Optimizely.prototype.onReady = function(options) { this.__readyPromise.then(function() { clearTimeout(readyTimeout); delete this.__readyTimeouts[timeoutId]; + resolveTimeoutPromise({ + success: true, + }); }.bind(this)); return Promise.race([this.__readyPromise, timeoutPromise]); From 9ab42ea0f95f9b3c3da0de0e9e4211e9510b5343 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Wed, 15 May 2019 16:54:00 -0700 Subject: [PATCH 3/4] Add test for clearing timeout --- .../lib/optimizely/index.tests.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index c4acf4919..2be2a668d 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -4831,11 +4831,17 @@ describe('lib/optimizely', function() { describe('onReady method', function() { var clock; + var setTimeoutSpy; + var clearTimeoutSpy; beforeEach(function() { clock = sinon.useFakeTimers(new Date().getTime()); + setTimeoutSpy = sinon.spy(clock, 'setTimeout'); + clearTimeoutSpy = sinon.spy(clock, 'clearTimeout'); }); afterEach(function() { + setTimeoutSpy.restore(); + clearTimeoutSpy.restore(); clock.restore(); }); @@ -4944,6 +4950,32 @@ describe('lib/optimizely', function() { return readyPromise3; }); }); + + it('clears the timeout when the project config manager ready promise fulfills', function() { + projectConfigManager.ProjectConfigManager.callsFake(function(config) { + return { + stop: sinon.stub(), + getConfig: sinon.stub().returns(null), + onUpdate: sinon.stub().returns(function() {}), + onReady: sinon.stub().returns(Promise.resolve({ success: true })), + }; + }); + optlyInstance = new Optimizely({ + clientEngine: 'node-sdk', + errorHandler: errorHandler, + eventDispatcher: eventDispatcher, + jsonSchemaValidator: jsonSchemaValidator, + logger: createdLogger, + sdkKey: '12345', + isValidInstance: true, + }); + return optlyInstance.onReady().then(function() { + sinon.assert.calledOnce(clock.setTimeout); + var timeout = clock.setTimeout.getCall(0).returnValue; + sinon.assert.calledOnce(clock.clearTimeout); + sinon.assert.calledWithExactly(clock.clearTimeout, timeout); + }); + }); }); describe('project config updates', function() { From 3474172827f9a6d5bc076ce534b9a2723b3c516d Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Wed, 15 May 2019 17:04:51 -0700 Subject: [PATCH 4/4] Update changelog --- packages/optimizely-sdk/CHANGELOG.MD | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/optimizely-sdk/CHANGELOG.MD b/packages/optimizely-sdk/CHANGELOG.MD index 6ddb2b216..f3330c849 100644 --- a/packages/optimizely-sdk/CHANGELOG.MD +++ b/packages/optimizely-sdk/CHANGELOG.MD @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] Changes that have landed but are not yet released. +### Bug Fixes: +- Clear timeout created in onReady call for timeout promise as soon as project config manager's ready promise fulfills + ### New Features - Added 60 second timeout for all datafile requests