Skip to content

Commit 6028c89

Browse files
committed
now passing emitter to DataSourceStatusManager and fixing related tests
1 parent 1c584d3 commit 6028c89

File tree

4 files changed

+20
-39
lines changed

4 files changed

+20
-39
lines changed

packages/shared/sdk-client/__tests__/datasource/DataSourceStatusManager.test.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@ import { DataSourceErrorKind } from '@launchdarkly/js-sdk-common/dist/internal';
22

33
import { DataSourceState } from '../../src/datasource/DataSourceStatus';
44
import DataSourceStatusManager from '../../src/datasource/DataSourceStatusManager';
5+
import LDEmitter from '../../src/LDEmitter';
56

67
describe('DataSourceStatusManager', () => {
78
test('its first state is closed', async () => {
8-
const underTest = new DataSourceStatusManager();
9+
const underTest = new DataSourceStatusManager(new LDEmitter());
910
expect(underTest.status.state).toEqual(DataSourceState.Closed);
1011
});
1112

1213
test('it stays at initializing if receives recoverable error', async () => {
13-
const underTest = new DataSourceStatusManager();
14+
const underTest = new DataSourceStatusManager(new LDEmitter());
1415
underTest.requestStateUpdate(DataSourceState.Initializing);
1516
underTest.reportError(DataSourceErrorKind.ErrorResponse, 'womp', 404, true);
1617
expect(underTest.status.state).toEqual(DataSourceState.Initializing);
1718
});
1819

1920
test('it moves to closed if receives unrecoverable error', async () => {
20-
const underTest = new DataSourceStatusManager();
21+
const underTest = new DataSourceStatusManager(new LDEmitter());
2122
underTest.requestStateUpdate(DataSourceState.Initializing);
2223
underTest.reportError(DataSourceErrorKind.ErrorResponse, 'womp', 404, false);
2324
expect(underTest.status.state).toEqual(DataSourceState.Closed);
@@ -26,7 +27,7 @@ describe('DataSourceStatusManager', () => {
2627
test('it updates last error time with each error, but not stateSince', async () => {
2728
let time = 0;
2829
const stamper: () => number = () => time;
29-
const underTest = new DataSourceStatusManager(stamper);
30+
const underTest = new DataSourceStatusManager(new LDEmitter(), stamper);
3031
underTest.reportError(DataSourceErrorKind.ErrorResponse, 'womp', 404, true);
3132
expect(underTest.status.stateSince).toEqual(0);
3233
expect(underTest.status.lastError?.time).toEqual(0);
@@ -46,7 +47,7 @@ describe('DataSourceStatusManager', () => {
4647
let time = 0;
4748
const stamper: () => number = () => time;
4849

49-
const underTest = new DataSourceStatusManager(stamper);
50+
const underTest = new DataSourceStatusManager(new LDEmitter(), stamper);
5051
expect(underTest.status.state).toEqual(DataSourceState.Closed);
5152
expect(underTest.status.stateSince).toEqual(0);
5253

@@ -62,9 +63,9 @@ describe('DataSourceStatusManager', () => {
6263
test('it notifies listeners when state changes', async () => {
6364
let time = 0;
6465
const stamper: () => number = () => time;
65-
const underTest = new DataSourceStatusManager(stamper);
66-
const spyListener = jest.fn();
67-
underTest.on(spyListener);
66+
const emitter = new LDEmitter();
67+
const spy = jest.spyOn(emitter, 'emit');
68+
const underTest = new DataSourceStatusManager(emitter, stamper);
6869

6970
underTest.requestStateUpdate(DataSourceState.SetOffline);
7071
time += 1;
@@ -73,33 +74,37 @@ describe('DataSourceStatusManager', () => {
7374
underTest.reportError(DataSourceErrorKind.ErrorResponse, 'womp', 400, true);
7475
time += 1;
7576
underTest.requestStateUpdate(DataSourceState.Closed);
76-
expect(spyListener).toHaveBeenCalledTimes(4);
77-
expect(spyListener).toHaveBeenNthCalledWith(
77+
expect(spy).toHaveBeenCalledTimes(4);
78+
expect(spy).toHaveBeenNthCalledWith(
7879
1,
80+
'dataSourceStatus',
7981
expect.objectContaining({
8082
state: DataSourceState.SetOffline,
8183
stateSince: 0,
8284
lastError: undefined,
8385
}),
8486
);
85-
expect(spyListener).toHaveBeenNthCalledWith(
87+
expect(spy).toHaveBeenNthCalledWith(
8688
2,
89+
'dataSourceStatus',
8790
expect.objectContaining({
8891
state: DataSourceState.Interrupted,
8992
stateSince: 1,
9093
lastError: expect.anything(),
9194
}),
9295
);
93-
expect(spyListener).toHaveBeenNthCalledWith(
96+
expect(spy).toHaveBeenNthCalledWith(
9497
3,
98+
'dataSourceStatus',
9599
expect.objectContaining({
96100
state: DataSourceState.Interrupted,
97101
stateSince: 1, // still in state interrupted
98102
lastError: expect.anything(),
99103
}),
100104
);
101-
expect(spyListener).toHaveBeenNthCalledWith(
105+
expect(spy).toHaveBeenNthCalledWith(
102106
4,
107+
'dataSourceStatus',
103108
expect.objectContaining({
104109
state: DataSourceState.Closed,
105110
stateSince: 3,

packages/shared/sdk-client/src/DataManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export abstract class BaseDataManager implements DataManager {
7878
protected readonly diagnosticsManager?: internal.DiagnosticsManager,
7979
) {
8080
this.logger = config.logger;
81-
this.dataSourceStatusManager = new DataSourceStatusManager();
81+
this.dataSourceStatusManager = new DataSourceStatusManager(emitter);
8282
this.dataSourceEventHandler = new DataSourceEventHandler(
8383
flagManager,
8484
this.dataSourceStatusManager,

packages/shared/sdk-client/src/LDClientImpl.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,6 @@ export default class LDClientImpl implements LDClient {
115115
this.emitter.emit('change', ldContext, flagKeys);
116116
});
117117

118-
// TODO: update this to get events from DataManager
119-
// this.dataSourceStatusManager.on((status: DataSourceStatus) => {
120-
// this.emitter.emit('dataSourceStatus', status);
121-
// });
122-
123118
this.dataManager = dataManagerFactory(
124119
this.flagManager,
125120
this.config,

packages/shared/sdk-client/src/datasource/DataSourceStatusManager.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,9 @@ export default class DataSourceStatusManager {
1717
private errorInfo?: DataSourceStatusErrorInfo;
1818
private timeStamper: () => number;
1919

20-
// TODO: at the moment the LDEmitter requires an event name internally, would be nice to not need to provide an event name,
21-
// but perhaps also not worth refactoring/supporting another style
22-
private emitter: LDEmitter;
23-
24-
constructor(timeStamper: () => number = () => Date.now()) {
20+
constructor(private readonly emitter: LDEmitter, timeStamper: () => number = () => Date.now()) {
2521
this.state = DataSourceState.Closed;
2622
this.stateSinceMillis = timeStamper();
27-
this.emitter = new LDEmitter();
2823
this.timeStamper = timeStamper;
2924
}
3025

@@ -59,20 +54,6 @@ export default class DataSourceStatusManager {
5954
}
6055
}
6156

62-
/**
63-
* @param listener that will be registered to receive updates
64-
*/
65-
on(listener: DataSourceStatusCallback) {
66-
this.emitter.on('dataSourceStatus', listener);
67-
}
68-
69-
/**
70-
* @param listener that will be unregisted and will no longer receive updates
71-
*/
72-
off(listener: DataSourceStatusCallback) {
73-
this.emitter.off('dataSourceStatus', listener);
74-
}
75-
7657
/**
7758
* Requests the manager move to the provided state. This request may be ignored
7859
* if the current state cannot transition to the requested state.

0 commit comments

Comments
 (0)