Skip to content

Commit 9827911

Browse files
authored
Integrate pendingEventsDispatcher in browser (#255)
1 parent 0b4e5b8 commit 9827911

File tree

7 files changed

+82
-190
lines changed

7 files changed

+82
-190
lines changed

packages/optimizely-sdk/lib/index.browser.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ var configValidator = require('./utils/config_validator');
2020
var defaultErrorHandler = require('./plugins/error_handler');
2121
var defaultEventDispatcher = require('./plugins/event_dispatcher/index.browser');
2222
var enums = require('./utils/enums');
23+
var eventProcessor = require('@optimizely/js-sdk-event-processor');
2324
var loggerPlugin = require('./plugins/logger');
2425
var Optimizely = require('./optimizely');
2526

2627
var logger = logging.getLogger();
2728
logging.setLogHandler(loggerPlugin.createLogger());
2829
logging.setLogLevel(logging.LogLevel.INFO);
2930

31+
var hasRetriedEvents = false;
3032
/**
3133
* Entry point into the Optimizely Browser SDK
3234
*/
@@ -83,23 +85,30 @@ module.exports = {
8385
config.skipJSONValidation = true;
8486
}
8587

86-
config = fns.assignIn(
87-
{
88-
eventDispatcher: defaultEventDispatcher,
89-
},
90-
config,
91-
{
92-
clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE,
93-
// always get the OptimizelyLogger facade from logging
94-
logger: logger,
95-
errorHandler: logging.getErrorHandler(),
96-
}
97-
);
88+
var wrappedEventDispatcher = new eventProcessor.LocalStoragePendingEventsDispatcher({
89+
eventDispatcher: config.eventDispatcher || defaultEventDispatcher,
90+
});
91+
if (!hasRetriedEvents) {
92+
wrappedEventDispatcher.sendPendingEvents();
93+
hasRetriedEvents = true;
94+
}
95+
96+
config = fns.assignIn({}, config, {
97+
eventDispatcher: wrappedEventDispatcher,
98+
clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE,
99+
// always get the OptimizelyLogger facade from logging
100+
logger: logger,
101+
errorHandler: logging.getErrorHandler(),
102+
});
98103

99104
return new Optimizely(config);
100105
} catch (e) {
101106
logger.error(e);
102107
return null;
103108
}
104109
},
110+
111+
__internalResetRetryState: function() {
112+
hasRetriedEvents = false;
113+
},
105114
};

packages/optimizely-sdk/lib/index.browser.tests.js

+56-10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
var logging = require('@optimizely/js-sdk-logging');
1717
var configValidator = require('./utils/config_validator');
18+
var eventProcessor = require('@optimizely/js-sdk-event-processor');
1819
var Optimizely = require('./optimizely');
1920
var optimizelyFactory = require('./index.browser');
2021
var packageJSON = require('../package.json');
@@ -25,6 +26,8 @@ var assert = chai.assert;
2526
var find = require('lodash/find');
2627
var sinon = require('sinon');
2728

29+
var LocalStoragePendingEventsDispatcher = eventProcessor.LocalStoragePendingEventsDispatcher;
30+
2831
describe('javascript-sdk', function() {
2932
describe('APIs', function() {
3033
var xhr;
@@ -40,8 +43,8 @@ describe('javascript-sdk', function() {
4043
});
4144

4245
describe('createInstance', function() {
43-
var fakeErrorHandler = { handleError: function() {}};
44-
var fakeEventDispatcher = { dispatchEvent: function() {}};
46+
var fakeErrorHandler = { handleError: function() {} };
47+
var fakeEventDispatcher = { dispatchEvent: function() {} };
4548
var silentLogger;
4649

4750
beforeEach(function() {
@@ -55,17 +58,41 @@ describe('javascript-sdk', function() {
5558
xhr = sinon.useFakeXMLHttpRequest();
5659
global.XMLHttpRequest = xhr;
5760
requests = [];
58-
xhr.onCreate = function (req) {
59-
requests.push(req);
61+
xhr.onCreate = function(req) {
62+
requests.push(req);
6063
};
64+
65+
sinon.spy(LocalStoragePendingEventsDispatcher.prototype, 'sendPendingEvents');
6166
});
6267

6368
afterEach(function() {
69+
LocalStoragePendingEventsDispatcher.prototype.sendPendingEvents.restore();
70+
optimizelyFactory.__internalResetRetryState();
6471
console.error.restore();
6572
configValidator.validate.restore();
6673
xhr.restore();
6774
});
6875

76+
it('should invoke resendPendingEvents at most once', function() {
77+
optimizelyFactory.createInstance({
78+
datafile: {},
79+
errorHandler: fakeErrorHandler,
80+
eventDispatcher: fakeEventDispatcher,
81+
logger: silentLogger,
82+
});
83+
84+
sinon.assert.calledOnce(LocalStoragePendingEventsDispatcher.prototype.sendPendingEvents);
85+
86+
optimizelyFactory.createInstance({
87+
datafile: {},
88+
errorHandler: fakeErrorHandler,
89+
eventDispatcher: fakeEventDispatcher,
90+
logger: silentLogger,
91+
});
92+
93+
sinon.assert.calledOnce(LocalStoragePendingEventsDispatcher.prototype.sendPendingEvents);
94+
});
95+
6996
it('should not throw if the provided config is not valid', function() {
7097
configValidator.validate.throws(new Error('Invalid config or something'));
7198
assert.doesNotThrow(function() {
@@ -157,10 +184,13 @@ describe('javascript-sdk', function() {
157184
var didSetVariation = optlyInstance.setForcedVariation('testExperiment', 'testUser', 'control');
158185
assert.strictEqual(didSetVariation, true);
159186

160-
var didSetVariation2 = optlyInstance.setForcedVariation('testExperimentLaunched', 'testUser', 'controlLaunched');
187+
var didSetVariation2 = optlyInstance.setForcedVariation(
188+
'testExperimentLaunched',
189+
'testUser',
190+
'controlLaunched'
191+
);
161192
assert.strictEqual(didSetVariation2, true);
162193

163-
164194
var variation = optlyInstance.getForcedVariation('testExperiment', 'testUser');
165195
assert.strictEqual(variation, 'control');
166196

@@ -179,7 +209,11 @@ describe('javascript-sdk', function() {
179209
var didSetVariation = optlyInstance.setForcedVariation('testExperiment', 'testUser', 'control');
180210
assert.strictEqual(didSetVariation, true);
181211

182-
var didSetVariation2 = optlyInstance.setForcedVariation('testExperimentLaunched', 'testUser', 'controlLaunched');
212+
var didSetVariation2 = optlyInstance.setForcedVariation(
213+
'testExperimentLaunched',
214+
'testUser',
215+
'controlLaunched'
216+
);
183217
assert.strictEqual(didSetVariation2, true);
184218

185219
var didSetVariation2 = optlyInstance.setForcedVariation('testExperimentLaunched', 'testUser', null);
@@ -203,10 +237,18 @@ describe('javascript-sdk', function() {
203237
var didSetVariation = optlyInstance.setForcedVariation('testExperiment', 'testUser', 'control');
204238
assert.strictEqual(didSetVariation, true);
205239

206-
var didSetVariation2 = optlyInstance.setForcedVariation('testExperimentLaunched', 'testUser', 'controlLaunched');
240+
var didSetVariation2 = optlyInstance.setForcedVariation(
241+
'testExperimentLaunched',
242+
'testUser',
243+
'controlLaunched'
244+
);
207245
assert.strictEqual(didSetVariation2, true);
208246

209-
var didSetVariation2 = optlyInstance.setForcedVariation('testExperimentLaunched', 'testUser', 'variationLaunched');
247+
var didSetVariation2 = optlyInstance.setForcedVariation(
248+
'testExperimentLaunched',
249+
'testUser',
250+
'variationLaunched'
251+
);
210252
assert.strictEqual(didSetVariation2, true);
211253

212254
var variation = optlyInstance.getForcedVariation('testExperiment', 'testUser');
@@ -245,7 +287,11 @@ describe('javascript-sdk', function() {
245287
logger: silentLogger,
246288
});
247289

248-
var didSetVariation = optlyInstance.setForcedVariation('testExperimentNotRunning', 'testUser', 'controlNotRunning');
290+
var didSetVariation = optlyInstance.setForcedVariation(
291+
'testExperimentNotRunning',
292+
'testUser',
293+
'controlNotRunning'
294+
);
249295
assert.strictEqual(didSetVariation, true);
250296

251297
var variation = optlyInstance.getVariation('testExperimentNotRunning', 'testUser');

packages/optimizely-sdk/lib/optimizely/event_dispatcher_bridge.js

-62
This file was deleted.

packages/optimizely-sdk/lib/optimizely/event_dispatcher_bridge.tests.js

-100
This file was deleted.

packages/optimizely-sdk/lib/optimizely/index.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ var attributesValidator = require('../utils/attributes_validator');
1919
var decisionService = require('../core/decision_service');
2020
var enums = require('../utils/enums');
2121
var eventBuilder = require('../core/event_builder/index.js');
22-
var EventDispatcherBridge = require('./event_dispatcher_bridge');
2322
var eventHelpers = require('../core/event_builder/event_helpers');
2423
var eventProcessor = require('@optimizely/js-sdk-event-processor');
2524
var eventTagsValidator = require('../utils/event_tags_validator');
@@ -67,7 +66,7 @@ function Optimizely(config) {
6766
this.clientEngine = clientEngine;
6867
this.clientVersion = config.clientVersion || enums.NODE_CLIENT_VERSION;
6968
this.errorHandler = config.errorHandler;
70-
this.eventDispatcher = new EventDispatcherBridge(config.eventDispatcher);
69+
this.eventDispatcher = config.eventDispatcher;
7170
this.isValidInstance = config.isValidInstance;
7271
this.logger = config.logger;
7372

packages/optimizely-sdk/package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/optimizely-sdk/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
},
3333
"homepage": "https://github.com/optimizely/javascript-sdk/tree/master/packages/optimizely-sdk",
3434
"dependencies": {
35-
"@optimizely/js-sdk-event-processor": "^0.1.0",
35+
"@optimizely/js-sdk-event-processor": "^0.2.0",
3636
"@optimizely/js-sdk-logging": "^0.1.0",
3737
"@optimizely/js-sdk-utils": "^0.1.0",
3838
"json-schema": "^0.2.3",

0 commit comments

Comments
 (0)