Skip to content

Commit 08d0df4

Browse files
[FSSDK-11003] review update
1 parent e516e39 commit 08d0df4

13 files changed

+108
-43
lines changed

lib/event_processor/batch_event_processor.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,12 @@ describe('QueueingEventProcessor', async () => {
266266
mockDispatch.mockResolvedValue({});
267267

268268
const dispatchRepeater = getMockRepeater();
269+
const failedEventRepeater = getMockRepeater();
269270

270271
const processor = new BatchEventProcessor({
271272
eventDispatcher,
272273
dispatchRepeater,
274+
failedEventRepeater,
273275
batchSize: 100,
274276
});
275277

@@ -285,6 +287,11 @@ describe('QueueingEventProcessor', async () => {
285287
expect(eventDispatcher.dispatchEvent).toHaveBeenCalledTimes(1);
286288
expect(eventDispatcher.dispatchEvent.mock.calls[0][0]).toEqual(buildLogEvent(events));
287289
expect(dispatchRepeater.reset).toHaveBeenCalledTimes(1);
290+
expect(dispatchRepeater.start).not.toHaveBeenCalled();
291+
expect(failedEventRepeater.start).not.toHaveBeenCalled();
292+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
293+
// @ts-ignore
294+
expect(processor.retryConfig?.maxRetries).toEqual(5);
288295
});
289296

290297
it('should store the event in the eventStore with increasing ids', async () => {

lib/event_processor/batch_event_processor.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -247,24 +247,30 @@ export class BatchEventProcessor extends BaseService implements EventProcessor {
247247
if (!this.isNew()) {
248248
return;
249249
}
250-
if(this.disposable) {
251-
this.batchSize = 1;
252-
this.retryConfig = {
253-
maxRetries: Math.min(this.retryConfig?.maxRetries ?? 5, 5),
254-
backoffProvider:
255-
this.retryConfig?.backoffProvider ||
256-
(() => new ExponentialBackoff(DEFAULT_MIN_BACKOFF, DEFAULT_MAX_BACKOFF, 500)),
257-
};
258-
}
250+
259251
super.start();
260252
this.state = ServiceState.Running;
261-
this.dispatchRepeater.start();
262-
this.failedEventRepeater?.start();
253+
254+
if(!this.disposable) {
255+
this.dispatchRepeater.start();
256+
this.failedEventRepeater?.start();
257+
}
263258

264259
this.retryFailedEvents();
265260
this.startPromise.resolve();
266261
}
267262

263+
makeDisposable(): void {
264+
super.makeDisposable();
265+
this.batchSize = 1;
266+
this.retryConfig = {
267+
maxRetries: Math.min(this.retryConfig?.maxRetries ?? 5, 5),
268+
backoffProvider:
269+
this.retryConfig?.backoffProvider ||
270+
(() => new ExponentialBackoff(DEFAULT_MIN_BACKOFF, DEFAULT_MAX_BACKOFF, 500)),
271+
}
272+
}
273+
268274
stop(): void {
269275
if (this.isDone()) {
270276
return;

lib/odp/event_manager/odp_event_manager.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ describe('DefaultOdpEventManager', () => {
211211
const apiManager = getMockApiManager();
212212
const repeater = getMockRepeater()
213213
apiManager.sendEvents.mockResolvedValue({ statusCode: 200 });
214-
// spy on the flush method
214+
215215
const odpEventManager = new DefaultOdpEventManager({
216216
repeater,
217217
apiManager: apiManager,
@@ -238,6 +238,7 @@ describe('DefaultOdpEventManager', () => {
238238
expect(apiManager.sendEvents).toHaveBeenCalledTimes(1);
239239
expect(apiManager.sendEvents).toHaveBeenNthCalledWith(1, config, [event]);
240240
expect(repeater.reset).toHaveBeenCalledTimes(1);
241+
expect(repeater.start).not.toHaveBeenCalled();
241242
})
242243

243244
it('drops events and logs if the state is not running', async () => {

lib/odp/event_manager/odp_event_manager.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,22 @@ 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 = Math.min(this.retryConfig.maxRetries, 5);
111-
this.batchSize = 1
112-
}
113108

114109
super.start();
110+
115111
if (this.odpIntegrationConfig) {
116112
this.goToRunningState();
117113
} else {
118114
this.state = ServiceState.Starting;
119115
}
120116
}
121117

118+
makeDisposable(): void {
119+
super.makeDisposable();
120+
this.retryConfig.maxRetries = Math.min(this.retryConfig.maxRetries, 5);
121+
this.batchSize = 1;
122+
}
123+
122124
updateConfig(odpIntegrationConfig: OdpIntegrationConfig): void {
123125
if (this.isDone()) {
124126
return;

lib/odp/odp_manager.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,5 +697,19 @@ describe('DefaultOdpManager', () => {
697697
eventManagerTerminatedPromise.reject(new Error(FAILED_TO_STOP));
698698
await expect(odpManager.onTerminated()).rejects.toThrow();
699699
});
700+
701+
it('should call makeDisposable() on eventManager when makeDisposable() is called on odpManager', async () => {
702+
const eventManager = getMockOdpEventManager();
703+
const segmentManager = getMockOdpSegmentManager();
704+
705+
const odpManager = new DefaultOdpManager({
706+
segmentManager,
707+
eventManager,
708+
});
709+
710+
odpManager.makeDisposable();
711+
712+
expect(eventManager.makeDisposable).toHaveBeenCalled();
713+
})
700714
});
701715

lib/odp/odp_manager.ts

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

9894
this.state = ServiceState.Starting;
9995

@@ -112,6 +108,11 @@ export class DefaultOdpManager extends BaseService implements OdpManager {
112108
});
113109
}
114110

111+
makeDisposable(): void {
112+
super.makeDisposable();
113+
this.eventManager.makeDisposable();
114+
}
115+
115116
private handleStartSuccess() {
116117
if (this.isDone()) {
117118
return;

lib/optimizely/index.spec.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import testData from '../tests/test_data';
2222
import { getForwardingEventProcessor } from '../event_processor/forwarding_event_processor';
2323
import { createProjectConfig } from '../project_config/project_config';
2424
import { getMockLogger } from '../tests/mock/mock_logger';
25+
import { createOdpManager } from '../odp/odp_manager_factory.node';
2526

2627
describe('Optimizely', () => {
2728
const errorHandler = { handleError: function() {} };
@@ -31,36 +32,34 @@ describe('Optimizely', () => {
3132
};
3233

3334
const eventProcessor = getForwardingEventProcessor(eventDispatcher);
34-
35+
const odpManager = createOdpManager({});
3536
const logger = getMockLogger();
36-
3737
const notificationCenter = createNotificationCenter({ logger, errorHandler });
3838

39-
it('should pass disposable option to the project config manager', () => {
39+
it('should pass disposable options to the respective services', () => {
4040
const projectConfigManager = getMockProjectConfigManager({
4141
initConfig: createProjectConfig(testData.getTestProjectConfig()),
4242
});
43-
43+
4444
vi.spyOn(projectConfigManager, 'makeDisposable');
45+
vi.spyOn(eventProcessor, 'makeDisposable');
46+
vi.spyOn(odpManager, 'makeDisposable');
4547

46-
const instance = new Optimizely({
48+
new Optimizely({
4749
clientEngine: 'node-sdk',
4850
projectConfigManager,
4951
errorHandler,
5052
jsonSchemaValidator,
5153
logger,
5254
notificationCenter,
5355
eventProcessor,
56+
odpManager,
5457
disposable: true,
5558
isValidInstance: true,
5659
});
5760

5861
expect(projectConfigManager.makeDisposable).toHaveBeenCalled();
59-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
60-
// @ts-ignore
61-
expect(instance.getProjectConfig()).toBe(projectConfigManager.config);
62-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
63-
// @ts-ignore
64-
expect(projectConfigManager.disposable).toBe(true);
62+
expect(eventProcessor.makeDisposable).toHaveBeenCalled();
63+
expect(odpManager.makeDisposable).toHaveBeenCalled();
6564
});
6665
});

lib/project_config/polling_datafile_manager.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,30 @@ describe('PollingDatafileManager', () => {
265265
await expect(manager.onTerminated()).rejects.toThrow();
266266
});
267267

268+
it('retries min(initRetry, 5) amount of times if datafile manager is disposable', async () => {
269+
const repeater = getMockRepeater();
270+
const requestHandler = getMockRequestHandler();
271+
const mockResponse = getMockAbortableRequest(Promise.reject('test error'));
272+
requestHandler.makeRequest.mockReturnValue(mockResponse);
273+
274+
const manager = new PollingDatafileManager({
275+
repeater,
276+
requestHandler,
277+
sdkKey: 'keyThatExists',
278+
initRetry: 10,
279+
});
280+
manager.makeDisposable();
281+
manager.start();
282+
283+
for(let i = 0; i < 6; i++) {
284+
const ret = repeater.execute(i);
285+
await expect(ret).rejects.toThrow();
286+
}
287+
288+
expect(repeater.isRunning()).toBe(false);
289+
expect(() => repeater.execute(6)).toThrow();
290+
})
291+
268292
it('retries specified number of times before rejecting onRunning() and onTerminated() when autoupdate is false', async () => {
269293
const repeater = getMockRepeater();
270294
const requestHandler = getMockRequestHandler();

lib/project_config/polling_datafile_manager.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,18 @@ export class PollingDatafileManager extends BaseService implements DatafileManag
8989
return;
9090
}
9191

92-
if(this.disposable) {
93-
this.initRetryRemaining = Math.min(this.initRetryRemaining ?? 5, 5);
94-
}
95-
9692
super.start();
9793
this.state = ServiceState.Starting;
9894
this.setDatafileFromCacheIfAvailable();
9995
this.repeater.setTask(this.syncDatafile.bind(this));
10096
this.repeater.start(true);
10197
}
10298

99+
makeDisposable(): void {
100+
super.makeDisposable();
101+
this.initRetryRemaining = Math.min(this.initRetryRemaining ?? 5, 5);
102+
}
103+
103104
stop(): void {
104105
if (this.isDone()) {
105106
return;

lib/project_config/project_config_manager.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,15 @@ describe('ProjectConfigManagerImpl', () => {
517517

518518
expect(listener).toHaveBeenCalledTimes(1);
519519
});
520+
521+
it('should make datafileManager disposable if makeDisposable() is called', async () => {
522+
const datafileManager = getMockDatafileManager({});
523+
vi.spyOn(datafileManager, 'makeDisposable');
524+
const manager = new ProjectConfigManagerImpl({ datafileManager });
525+
manager.makeDisposable();
526+
527+
expect(datafileManager.makeDisposable).toHaveBeenCalled();
528+
})
520529
});
521530
});
522531
});

0 commit comments

Comments
 (0)