Skip to content

Commit 11c850d

Browse files
[FSSDK-11003] disposable odp manager
1 parent 060cbc3 commit 11c850d

File tree

4 files changed

+54
-9
lines changed

4 files changed

+54
-9
lines changed

lib/odp/event_manager/odp_event_manager.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,39 @@ describe('DefaultOdpEventManager', () => {
207207
}
208208
});
209209

210+
it('should flush the queue immediately if disposable, regardless of the batchSize', async () => {
211+
const apiManager = getMockApiManager();
212+
const repeater = getMockRepeater()
213+
apiManager.sendEvents.mockResolvedValue({ statusCode: 200 });
214+
// spy on the flush method
215+
const odpEventManager = new DefaultOdpEventManager({
216+
repeater,
217+
apiManager: apiManager,
218+
batchSize: 10,
219+
retryConfig: {
220+
maxRetries: 3,
221+
backoffProvider: vi.fn(),
222+
},
223+
});
224+
225+
odpEventManager.updateConfig({
226+
integrated: true,
227+
odpConfig: config,
228+
});
229+
odpEventManager.makeDisposable();
230+
odpEventManager.start();
231+
232+
await expect(odpEventManager.onRunning()).resolves.not.toThrow();
233+
234+
const event = makeEvent(0);
235+
odpEventManager.sendEvent(event);
236+
await exhaustMicrotasks();
237+
238+
expect(apiManager.sendEvents).toHaveBeenCalledTimes(1);
239+
expect(apiManager.sendEvents).toHaveBeenNthCalledWith(1, config, [event]);
240+
expect(repeater.reset).toHaveBeenCalledTimes(1);
241+
})
242+
210243
it('drops events and logs if the state is not running', async () => {
211244
const apiManager = getMockApiManager();
212245
apiManager.sendEvents.mockResolvedValue({ statusCode: 200 });

lib/odp/event_manager/odp_event_manager.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ export class DefaultOdpEventManager extends BaseService implements OdpEventManag
105105
if (!this.isNew) {
106106
return;
107107
}
108+
// Override for disposable event manager
109+
if(this.disposable) {
110+
this.retryConfig.maxRetries = 5;
111+
this.batchSize = 1
112+
}
108113

109114
super.start();
110115
if (this.odpIntegrationConfig) {

lib/odp/odp_manager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ export class DefaultOdpManager extends BaseService implements OdpManager {
9090
if (!this.isNew()) {
9191
return;
9292
}
93+
94+
if(this.disposable) {
95+
this.eventManager.makeDisposable();
96+
}
9397

9498
this.state = ServiceState.Starting;
9599

lib/optimizely/index.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,20 @@ export default class Optimizely implements Client {
141141
this.errorHandler = config.errorHandler;
142142
this.isOptimizelyConfigValid = config.isValidInstance;
143143
this.logger = config.logger;
144+
this.projectConfigManager = config.projectConfigManager;
145+
this.notificationCenter = config.notificationCenter;
144146
this.odpManager = config.odpManager;
145147
this.vuidManager = config.vuidManager;
148+
this.eventProcessor = config.eventProcessor;
149+
150+
if(config.disposable) {
151+
this.projectConfigManager.makeDisposable();
152+
this.eventProcessor?.makeDisposable();
153+
this.odpManager?.makeDisposable();
154+
}
146155

147156
let decideOptionsArray = config.defaultDecideOptions ?? [];
157+
148158
if (!Array.isArray(decideOptionsArray)) {
149159
this.logger.log(LOG_LEVEL.DEBUG, INVALID_DEFAULT_DECIDE_OPTIONS, MODULE_NAME);
150160
decideOptionsArray = [];
@@ -160,7 +170,6 @@ export default class Optimizely implements Client {
160170
}
161171
});
162172
this.defaultDecideOptions = defaultDecideOptions;
163-
this.projectConfigManager = config.projectConfigManager;
164173

165174
this.disposeOnUpdate = this.projectConfigManager.onUpdate((configObj: projectConfig.ProjectConfig) => {
166175
this.logger.log(
@@ -176,10 +185,6 @@ export default class Optimizely implements Client {
176185
this.updateOdpSettings();
177186
});
178187

179-
if(config.disposable) {
180-
this.projectConfigManager.makeDisposable();
181-
}
182-
183188
this.projectConfigManager.start();
184189
const projectConfigManagerRunningPromise = this.projectConfigManager.onRunning();
185190

@@ -201,10 +206,6 @@ export default class Optimizely implements Client {
201206
UNSTABLE_conditionEvaluators: config.UNSTABLE_conditionEvaluators,
202207
});
203208

204-
this.notificationCenter = config.notificationCenter;
205-
206-
this.eventProcessor = config.eventProcessor;
207-
208209
this.eventProcessor?.start();
209210
const eventProcessorRunningPromise = this.eventProcessor ? this.eventProcessor.onRunning() :
210211
Promise.resolve(undefined);
@@ -213,6 +214,8 @@ export default class Optimizely implements Client {
213214
this.notificationCenter.sendNotifications(NOTIFICATION_TYPES.LOG_EVENT, event);
214215
});
215216

217+
this.odpManager?.start();
218+
216219
this.readyPromise = Promise.all([
217220
projectConfigManagerRunningPromise,
218221
eventProcessorRunningPromise,

0 commit comments

Comments
 (0)