Skip to content

Commit 379ebd0

Browse files
authored
[FSSDK-11497] fire config update events synchronously (#1043)
fire the project config updates synchronously. this will allow the optimizely class to propagate the initial project config synchronously to all sub components. This can be useful when the client is initialized with a datafile. One downside is, the update event handler needs to be registered before calling start() on the config manager, but since we only use the config manager internally, we can maintain that.
1 parent 299e1d7 commit 379ebd0

File tree

2 files changed

+17
-22
lines changed

2 files changed

+17
-22
lines changed

lib/project_config/project_config_manager.spec.ts

+16-18
Original file line numberDiff line numberDiff line change
@@ -121,24 +121,17 @@ describe('ProjectConfigManagerImpl', () => {
121121
expect(manager.getState()).toBe(ServiceState.Running);
122122
});
123123

124-
it('should call onUpdate listeners registered before or after start() with the project config after resolving onRunning()', async () => {
124+
it('should call onUpdate listeners registered before start() with the project config', async () => {
125125
const logger = getMockLogger();
126126
const manager = new ProjectConfigManagerImpl({ logger, datafile: testData.getTestProjectConfig()});
127-
const listener1 = vi.fn();
128-
manager.onUpdate(listener1);
127+
const listener = vi.fn();
128+
manager.onUpdate(listener);
129129
manager.start();
130-
const listener2 = vi.fn();
131-
manager.onUpdate(listener2);
132-
expect(listener1).not.toHaveBeenCalled();
133-
expect(listener2).not.toHaveBeenCalledOnce();
134130

135131
await manager.onRunning();
136132

137-
expect(listener1).toHaveBeenCalledOnce();
138-
expect(listener2).toHaveBeenCalledOnce();
139-
140-
expect(listener1).toHaveBeenCalledWith(createProjectConfig(testData.getTestProjectConfig()));
141-
expect(listener2).toHaveBeenCalledWith(createProjectConfig(testData.getTestProjectConfig()));
133+
expect(listener).toHaveBeenCalledOnce();
134+
expect(listener).toHaveBeenCalledWith(createProjectConfig(testData.getTestProjectConfig()));
142135
});
143136

144137
it('should return the correct config from getConfig() both before or after onRunning() resolves', async () => {
@@ -187,8 +180,8 @@ describe('ProjectConfigManagerImpl', () => {
187180
const listener = vi.fn();
188181

189182
const manager = new ProjectConfigManagerImpl({ datafile: testData.getTestProjectConfig(), datafileManager });
190-
manager.start();
191183
manager.onUpdate(listener);
184+
manager.start();
192185
await expect(manager.onRunning()).resolves.not.toThrow();
193186
expect(listener).toHaveBeenCalledWith(createProjectConfig(testData.getTestProjectConfig()));
194187
});
@@ -309,11 +302,12 @@ describe('ProjectConfigManagerImpl', () => {
309302

310303
const datafile = testData.getTestProjectConfig();
311304
const manager = new ProjectConfigManagerImpl({ datafile, datafileManager });
312-
manager.start();
313305

314306
const listener = vi.fn();
315307
manager.onUpdate(listener);
316308

309+
manager.start();
310+
317311
expect(manager.getConfig()).toEqual(createProjectConfig(datafile));
318312
await manager.onRunning();
319313
expect(manager.getConfig()).toEqual(createProjectConfig(datafile));
@@ -334,11 +328,12 @@ describe('ProjectConfigManagerImpl', () => {
334328
const logger = getMockLogger();
335329
const datafile = testData.getTestProjectConfig();
336330
const manager = new ProjectConfigManagerImpl({ logger, datafile, datafileManager });
337-
manager.start();
338331

339332
const listener = vi.fn();
340333
manager.onUpdate(listener);
341334

335+
manager.start();
336+
342337
expect(manager.getConfig()).toEqual(createProjectConfig(testData.getTestProjectConfig()));
343338
await manager.onRunning();
344339
expect(manager.getConfig()).toEqual(createProjectConfig(testData.getTestProjectConfig()));
@@ -379,11 +374,12 @@ describe('ProjectConfigManagerImpl', () => {
379374

380375
const datafile = testData.getTestProjectConfig();
381376
const manager = new ProjectConfigManagerImpl({ datafile, datafileManager });
382-
manager.start();
383377

384378
const listener = vi.fn();
385379
manager.onUpdate(listener);
386380

381+
manager.start();
382+
387383
expect(manager.getConfig()).toEqual(createProjectConfig(datafile));
388384
await manager.onRunning();
389385
expect(manager.getConfig()).toEqual(createProjectConfig(datafile));
@@ -401,11 +397,12 @@ describe('ProjectConfigManagerImpl', () => {
401397
const datafileManager = getMockDatafileManager({});
402398

403399
const manager = new ProjectConfigManagerImpl({ datafile });
404-
manager.start();
405400

406401
const listener = vi.fn();
407402
const dispose = manager.onUpdate(listener);
408403

404+
manager.start();
405+
409406
await manager.onRunning();
410407
expect(listener).toHaveBeenNthCalledWith(1, createProjectConfig(datafile));
411408

@@ -420,11 +417,12 @@ describe('ProjectConfigManagerImpl', () => {
420417
const datafile = testData.getTestProjectConfig();
421418

422419
const manager = new ProjectConfigManagerImpl({ datafile: JSON.stringify(datafile) });
423-
manager.start();
424420

425421
const listener = vi.fn();
426422
manager.onUpdate(listener);
427423

424+
manager.start();
425+
428426
await manager.onRunning();
429427
expect(listener).toHaveBeenCalledWith(createProjectConfig(datafile));
430428
expect(manager.getConfig()).toEqual(createProjectConfig(datafile));

lib/project_config/project_config_manager.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { createOptimizelyConfig } from './optimizely_config';
1818
import { OptimizelyConfig } from '../shared_types';
1919
import { DatafileManager } from './datafile_manager';
2020
import { ProjectConfig, toDatafile, tryCreatingProjectConfig } from './project_config';
21-
import { scheduleMicrotask } from '../utils/microtask';
2221
import { Service, ServiceState, BaseService } from '../service';
2322
import { Consumer, Fn, Transformer } from '../utils/type';
2423
import { EventEmitter } from '../utils/event_emitter/event_emitter';
@@ -166,9 +165,7 @@ export class ProjectConfigManagerImpl extends BaseService implements ProjectConf
166165
if (this.projectConfig?.revision !== config.revision) {
167166
this.projectConfig = config;
168167
this.optimizelyConfig = undefined;
169-
scheduleMicrotask(() => {
170-
this.eventEmitter.emit('update', config);
171-
})
168+
this.eventEmitter.emit('update', config);
172169
}
173170
} catch (err) {
174171
this.logger?.error(err);

0 commit comments

Comments
 (0)