Skip to content

Commit 8cce2f3

Browse files
authored
Update OdpOptions to handle additional granular configuration options for ODP Segment and Event Managers (#805)
1 parent 88d711a commit 8cce2f3

File tree

12 files changed

+552
-150
lines changed

12 files changed

+552
-150
lines changed

packages/optimizely-sdk/lib/core/odp/odp_event_manager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ export class OdpEventManager implements IOdpEventManager {
143143
let defaultQueueSize = DEFAULT_BROWSER_QUEUE_SIZE;
144144

145145
try {
146+
// TODO: Consider refactoring to use typeof process and combine w/above line
146147
if (process) {
147148
defaultQueueSize = DEFAULT_SERVER_QUEUE_SIZE;
148149
}

packages/optimizely-sdk/lib/core/odp/odp_manager.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { getLogger, LogHandler, LogLevel } from '../../modules/logging';
1919
import { ERROR_MESSAGES, ODP_USER_KEY } from '../../utils/enums';
2020

2121
import { RequestHandler } from './../../utils/http_request_handler/http';
22-
import { BrowserLRUCache } from './../../utils/lru_cache/browser_lru_cache';
22+
2323
import { LRUCache } from './../../utils/lru_cache/lru_cache';
2424

2525
import { VuidManager } from '../../plugins/vuid_manager';
@@ -32,26 +32,25 @@ import { OdpEventApiManager } from './odp_event_api_manager';
3232
import { OptimizelySegmentOption } from './optimizely_segment_option';
3333
import { invalidOdpDataFound } from './odp_utils';
3434
import { OdpEvent } from './odp_event';
35+
import { OdpOptions } from '../../shared_types';
3536

3637
/**
37-
* @param {boolean} disable Flag for disabling ODP Manager.
38-
* @param {RequestHandler} requestHandler HTTP request handler that will be used by Segment and Event Managers.
38+
* @param {LRUCache<string, string>[]} segmentLRUCache Cache to be used for storing segments.
39+
* @param {RequestHandler} segmentRequestHandler HTTP request handler that will be used by the ODP Segment Manager.
40+
* @param {RequestHandler} eventRequestHandler HTTP request handler that will be used by the ODP Event Manager.
3941
* @param {LogHandler} logger (Optional) Accepts custom LogHandler. Defaults to the default global LogHandler.
4042
* @param {string} clientEngine (Optional) String denoting specific client engine being used. Defaults to 'javascript-sdk'.
4143
* @param {string} clientVersion (Optional) String denoting specific client version. Defaults to current version value from package.json.
42-
* @param {LRUCache<string, string[]>} segmentsCache (Optional) Accepts a custom LRUCache. Defaults to BrowserLRUCache.
43-
* @param {OdpEventManager} eventManager (Optional) Accepts a custom ODPEventManager.
44-
* @param {OdpSegmentManager} segmentManager (Optional) Accepts a custom ODPSegmentManager.
44+
* @param {OdpOptions} odpOptions (Optional) Configuration settings for various ODP options from segment cache size to event flush interval.
4545
*/
4646
interface OdpManagerConfig {
47-
disable: boolean;
48-
requestHandler: RequestHandler;
47+
segmentLRUCache: LRUCache<string, string[]>;
48+
segmentRequestHandler: RequestHandler;
49+
eventRequestHandler: RequestHandler;
4950
logger?: LogHandler;
5051
clientEngine?: string;
5152
clientVersion?: string;
52-
segmentsCache?: LRUCache<string, string[]>;
53-
eventManager?: OdpEventManager;
54-
segmentManager?: OdpSegmentManager;
53+
odpOptions?: OdpOptions;
5554
}
5655

5756
/**
@@ -75,16 +74,15 @@ export class OdpManager {
7574
public eventManager: OdpEventManager | undefined;
7675

7776
constructor({
78-
disable,
79-
requestHandler,
77+
segmentLRUCache,
78+
segmentRequestHandler,
79+
eventRequestHandler,
8080
logger,
8181
clientEngine,
8282
clientVersion,
83-
segmentsCache,
84-
eventManager,
85-
segmentManager,
83+
odpOptions,
8684
}: OdpManagerConfig) {
87-
this.enabled = !disable;
85+
this.enabled = !odpOptions?.disabled;
8886
this.logger = logger || getLogger();
8987

9088
if (!this.enabled) {
@@ -93,28 +91,31 @@ export class OdpManager {
9391
}
9492

9593
// Set up Segment Manager (Audience Segments GraphQL API Interface)
96-
if (segmentManager) {
97-
this.segmentManager = segmentManager;
94+
if (odpOptions?.segmentManager) {
95+
this.segmentManager = odpOptions.segmentManager;
9896
this.segmentManager.updateSettings(this.odpConfig);
9997
} else {
10098
this.segmentManager = new OdpSegmentManager(
10199
this.odpConfig,
102-
segmentsCache || new BrowserLRUCache<string, string[]>(),
103-
new OdpSegmentApiManager(requestHandler, this.logger)
100+
segmentLRUCache,
101+
new OdpSegmentApiManager(segmentRequestHandler, this.logger)
104102
);
105103
}
106104

107105
// Set up Events Manager (Events REST API Interface)
108-
if (eventManager) {
109-
this.eventManager = eventManager;
106+
if (odpOptions?.eventManager) {
107+
this.eventManager = odpOptions.eventManager;
110108
this.eventManager.updateSettings(this.odpConfig);
111109
} else {
112110
this.eventManager = new OdpEventManager({
113111
odpConfig: this.odpConfig,
114-
apiManager: new OdpEventApiManager(requestHandler, this.logger),
112+
apiManager: new OdpEventApiManager(eventRequestHandler, this.logger),
115113
logger: this.logger,
116114
clientEngine: clientEngine || 'javascript-sdk',
117115
clientVersion: clientVersion || BROWSER_CLIENT_VERSION,
116+
flushInterval: odpOptions?.eventFlushInterval,
117+
batchSize: odpOptions?.eventBatchSize,
118+
queueSize: odpOptions?.eventQueueSize,
118119
});
119120
}
120121

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

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@ import optimizelyFactory from './index.browser';
2525
import configValidator from './utils/config_validator';
2626
import eventProcessorConfigValidator from './utils/event_processor_config_validator';
2727
import OptimizelyUserContext from './optimizely_user_context';
28-
import { LOG_MESSAGES, ODP_DEFAULT_EVENT_TYPE, ODP_EVENT_ACTION } from './utils/enums';
29-
import { BrowserLRUCache } from './utils/lru_cache';
30-
import { OdpConfig } from './core/odp/odp_config';
28+
import { LOG_MESSAGES, ODP_EVENT_ACTION } from './utils/enums';
3129
import { BrowserOdpManager } from './plugins/odp_manager/index.browser';
32-
import { OdpEvent } from './core/odp/odp_event';
30+
import { OdpConfig } from './core/odp/odp_config';
3331

3432
var LocalStoragePendingEventsDispatcher = eventProcessor.LocalStoragePendingEventsDispatcher;
3533

@@ -612,7 +610,7 @@ describe('javascript-sdk (Browser)', function() {
612610
eventDispatcher: fakeEventDispatcher,
613611
eventBatchSize: null,
614612
logger,
615-
odpManager: BrowserOdpManager.createBrowserOdpManager({
613+
odpManager: new BrowserOdpManager({
616614
logger,
617615
odpOptions: {
618616
disabled: true,
@@ -630,7 +628,7 @@ describe('javascript-sdk (Browser)', function() {
630628
eventDispatcher: fakeEventDispatcher,
631629
eventBatchSize: null,
632630
logger,
633-
odpManager: BrowserOdpManager.createBrowserOdpManager({
631+
odpManager: new BrowserOdpManager({
634632
logger,
635633
odpOptions: {
636634
segmentsCacheSize: 10,
@@ -652,7 +650,7 @@ describe('javascript-sdk (Browser)', function() {
652650
eventDispatcher: fakeEventDispatcher,
653651
eventBatchSize: null,
654652
logger,
655-
odpManager: BrowserOdpManager.createBrowserOdpManager({
653+
odpManager: new BrowserOdpManager({
656654
logger,
657655
odpOptions: {
658656
segmentsCacheTimeout: 10,
@@ -674,7 +672,7 @@ describe('javascript-sdk (Browser)', function() {
674672
eventDispatcher: fakeEventDispatcher,
675673
eventBatchSize: null,
676674
logger,
677-
odpManager: BrowserOdpManager.createBrowserOdpManager({
675+
odpManager: new BrowserOdpManager({
678676
logger,
679677
odpOptions: {
680678
segmentsCacheSize: 10,
@@ -696,7 +694,8 @@ describe('javascript-sdk (Browser)', function() {
696694
);
697695
});
698696

699-
it('should accept a valid custom odp segment manager', () => {
697+
// TODO: Patch VUID Promise Pattern (@Andy)
698+
it('should accept a valid custom odp segment manager', async () => {
700699
const fakeSegmentManager = {
701700
fetchQualifiedSegments: sinon.spy(),
702701
updateSettings: sinon.spy(),
@@ -708,17 +707,26 @@ describe('javascript-sdk (Browser)', function() {
708707
eventDispatcher: fakeEventDispatcher,
709708
eventBatchSize: null,
710709
logger,
711-
odpManager: BrowserOdpManager.createBrowserOdpManager({
710+
odpManager: new BrowserOdpManager({
712711
logger,
713712
odpOptions: {
714713
segmentManager: fakeSegmentManager,
715714
},
716715
}),
717716
});
718717

719-
client.fetchQualifiedSegments(testVuid);
718+
sinon.assert.called(fakeSegmentManager.updateSettings);
719+
720+
try {
721+
const readyData = await client.onReady();
722+
assert.equal(readyData.success, true);
723+
assert.isEmpty(readyData.reason);
724+
725+
await client.fetchQualifiedSegments(testVuid);
720726

721-
sinon.assert.calledWith(fakeSegmentManager.updateSettings, new OdpConfig());
727+
sinon.assert.notCalled(logger.error);
728+
sinon.assert.called(fakeSegmentManager.fetchQualifiedSegments);
729+
} catch (e) {}
722730
});
723731

724732
it('should accept a valid custom odp event manager', () => {
@@ -738,7 +746,7 @@ describe('javascript-sdk (Browser)', function() {
738746
eventDispatcher: fakeEventDispatcher,
739747
eventBatchSize: null,
740748
logger,
741-
odpManager: BrowserOdpManager.createBrowserOdpManager({
749+
odpManager: new BrowserOdpManager({
742750
logger,
743751
odpOptions: {
744752
eventManager: fakeEventManager,
@@ -749,7 +757,7 @@ describe('javascript-sdk (Browser)', function() {
749757
sinon.assert.called(fakeEventManager.start);
750758
});
751759

752-
// TODO: Finish this test
760+
// TODO: Patch VUID Promise Pattern (@Andy)
753761
it('should send an odp event with sendOdpEvent', async () => {
754762
const fakeOdpManager = {
755763
sendEvent: sinon.spy(),
@@ -780,15 +788,15 @@ describe('javascript-sdk (Browser)', function() {
780788
} catch (e) {}
781789
});
782790

783-
// TODO: Finish this test
791+
// TODO: Patch VUID Promise Pattern (@Andy)
784792
it('should log an error when attempting to send an odp event when odp is disabled', async () => {
785793
const client = optimizelyFactory.createInstance({
786794
datafile: testData.getTestProjectConfigWithFeatures(),
787795
errorHandler: fakeErrorHandler,
788796
eventDispatcher: fakeEventDispatcher,
789797
eventBatchSize: null,
790798
logger,
791-
odpManager: BrowserOdpManager.createBrowserOdpManager({
799+
odpManager: new BrowserOdpManager({
792800
logger,
793801
odpOptions: {
794802
disabled: true,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ const createInstance = function(config: Config): Client | null {
125125
: undefined,
126126
notificationCenter,
127127
isValidInstance: isValidInstance,
128-
odpManager: BrowserOdpManager.createBrowserOdpManager({ logger, odpOptions: config.odpOptions }),
128+
odpManager: new BrowserOdpManager({ logger, odpOptions: config.odpOptions }),
129129
};
130130

131131
const optimizely = new BrowserOptimizely(optimizelyOptions);

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { assert, expect } from 'chai';
1717
import sinon from 'sinon';
1818
import { sprintf } from '../utils/fns';
1919
import { NOTIFICATION_TYPES } from '../utils/enums';
20-
import eventProcessor from '../plugins/event_processor';
2120
import * as logging from '../modules/logging';
2221

2322
import Optimizely from './';
@@ -40,8 +39,7 @@ import { createForwardingEventProcessor } from '../plugins/event_processor/forwa
4039
import { createEventProcessor } from '../plugins/event_processor';
4140
import { createNotificationCenter } from '../core/notification_center';
4241
import { createHttpPollingDatafileManager } from '../plugins/datafile_manager/http_polling_datafile_manager';
43-
import { OdpManager } from '../core/odp/odp_manager';
44-
import { getLogger } from '../modules/logging';
42+
import { NodeOdpManager } from '../plugins/odp_manager/index.node';
4543

4644
var ERROR_MESSAGES = enums.ERROR_MESSAGES;
4745
var LOG_LEVEL = enums.LOG_LEVEL;
@@ -10088,6 +10086,7 @@ describe('lib/optimizely', function() {
1008810086
});
1008910087
});
1009010088

10089+
// Note: /lib/index.browser.tests.js contains relevant Opti Client x Browser ODP Tests
1009110090
// TODO: Finish these tests in ODP Node.js Implementation
1009210091
describe('odp', () => {
1009310092
var optlyInstanceWithOdp;
@@ -10112,9 +10111,7 @@ describe('lib/optimizely', function() {
1011210111
eventBatchSize: 1,
1011310112
eventProcessor,
1011410113
notificationCenter,
10115-
odpManager: new OdpManager({
10116-
disable: false,
10117-
}),
10114+
odpManager: new NodeOdpManager({}),
1011810115
});
1011910116

1012010117
bucketStub = sinon.stub(bucketer, 'bucket');
@@ -10142,9 +10139,11 @@ describe('lib/optimizely', function() {
1014210139
eventBatchSize: 1,
1014310140
eventProcessor,
1014410141
notificationCenter,
10145-
odpManager: new OdpManager({
10146-
disable: true,
10142+
odpManager: new NodeOdpManager({
1014710143
logger: createdLogger,
10144+
odpOptions: {
10145+
disabled: true,
10146+
},
1014810147
}),
1014910148
});
1015010149

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1663,7 +1663,7 @@ export default class Optimizely {
16631663
* Sends an action as an ODP Event with optional custom parameters including type, identifiers, and data
16641664
* Note: Since this depends on this.odpManager, it must await Optimizely client's onReady() promise resolution.
16651665
* @param {Object} odpEvent
1666-
* @param {ODP_EVENT_ACTION} odpEvent.action Subcategory of the event type (i.e. "client_initialized", or "")
1666+
* @param {ODP_EVENT_ACTION} odpEvent.action Subcategory of the event type (i.e. "client_initialized", or "identified")
16671667
* @param {string} odpEvent.type (Optional) Type of event (Defaults to "fullstack")
16681668
* @param {Map<string, string>} odpEvent.identifiers (Optional) Key-value map of user identifiers
16691669
* @param {Map<string, string>} odpEvent.data (Optional) Event data in a key-value map.

0 commit comments

Comments
 (0)