Skip to content

Commit 2eec4e8

Browse files
authored
fix (datafile manager): Update datafile manager interface: onReady becomes a method (#4)
1 parent 8135a51 commit 2eec4e8

File tree

4 files changed

+42
-38
lines changed

4 files changed

+42
-38
lines changed

packages/datafile-manager/__test__/httpPollingDatafileManager.spec.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ describe('httpPollingDatafileManager', () => {
7575
headers: {}
7676
})
7777
manager.start()
78-
await manager.onReady
78+
await manager.onReady()
7979
expect(manager.get()).toBe('{"foo": "bar"}')
8080
})
8181
})
@@ -102,7 +102,7 @@ describe('httpPollingDatafileManager', () => {
102102
manager.start()
103103
expect(makeGetRequestSpy).toBeCalledTimes(1)
104104
expect(makeGetRequestSpy.mock.calls[0][0]).toBe('https://cdn.optimizely.com/datafiles/123.json')
105-
await manager.onReady
105+
await manager.onReady()
106106
})
107107

108108
it('after being started, fetches the datafile and resolves onReady', async () => {
@@ -112,7 +112,7 @@ describe('httpPollingDatafileManager', () => {
112112
headers: {},
113113
})
114114
manager.start()
115-
await manager.onReady
115+
await manager.onReady()
116116
expect(manager.get()).toBe('{"foo": "bar"}')
117117
})
118118

@@ -127,7 +127,7 @@ describe('httpPollingDatafileManager', () => {
127127
const setTimeoutSpy: jest.SpyInstance<() => void, [() => void, number]> = jest.spyOn(testTimeoutFactory, 'setTimeout')
128128

129129
manager.start()
130-
await manager.onReady
130+
await manager.onReady()
131131
expect(setTimeoutSpy).toBeCalledTimes(1)
132132
expect(setTimeoutSpy.mock.calls[0][1]).toBe(10)
133133
})
@@ -155,7 +155,7 @@ describe('httpPollingDatafileManager', () => {
155155
manager.on('update', updateFn)
156156

157157
manager.start()
158-
await manager.onReady
158+
await manager.onReady()
159159
expect(manager.get()).toBe('{"foo": "bar"}')
160160
expect(updateFn).toBeCalledTimes(0)
161161

@@ -184,7 +184,7 @@ describe('httpPollingDatafileManager', () => {
184184
)
185185

186186
manager.start()
187-
await manager.onReady
187+
await manager.onReady()
188188

189189
expect(testTimeoutFactory.timeoutFns.length).toBe(1)
190190
expect(testTimeoutFactory.cancelFns.length).toBe(1)
@@ -207,7 +207,7 @@ describe('httpPollingDatafileManager', () => {
207207
)
208208

209209
manager.start()
210-
await manager.onReady
210+
await manager.onReady()
211211
expect(manager.get()).toBe('{"foo": "bar"}')
212212
testTimeoutFactory.timeoutFns[0]()
213213
expect(manager.responsePromises.length).toBe(2)
@@ -255,7 +255,7 @@ describe('httpPollingDatafileManager', () => {
255255
expect(testTimeoutFactory.timeoutFns.length).toBe(1)
256256
// Trigger the update, should fetch the next response which should succeed, then we get ready
257257
testTimeoutFactory.timeoutFns[0]()
258-
await manager.onReady
258+
await manager.onReady()
259259
expect(manager.get()).toBe('{"foo": "bar"}')
260260
})
261261

@@ -280,7 +280,7 @@ describe('httpPollingDatafileManager', () => {
280280
manager.on('update', updateFn)
281281

282282
manager.start()
283-
await manager.onReady
283+
await manager.onReady()
284284
expect(manager.get()).toBe('{"foo": "bar"}')
285285
// First response promise was for the initial 200 response
286286
expect(manager.responsePromises.length).toBe(1)
@@ -310,7 +310,7 @@ describe('httpPollingDatafileManager', () => {
310310
}
311311
)
312312
manager.start()
313-
await manager.onReady
313+
await manager.onReady()
314314
const makeGetRequestSpy = jest.spyOn(manager, 'makeGetRequest')
315315
testTimeoutFactory.timeoutFns[0]()
316316
expect(makeGetRequestSpy).toBeCalledTimes(1)
@@ -337,7 +337,7 @@ describe('httpPollingDatafileManager', () => {
337337
headers: {},
338338
})
339339
manager.start()
340-
await manager.onReady
340+
await manager.onReady()
341341
expect(manager.get()).toBe('{"foo": "bar"}')
342342
})
343343

@@ -350,7 +350,7 @@ describe('httpPollingDatafileManager', () => {
350350
const updateFn = jest.fn()
351351
manager.on('update', updateFn)
352352
manager.start()
353-
await manager.onReady
353+
await manager.onReady()
354354
expect(testTimeoutFactory.timeoutFns.length).toBe(0)
355355
})
356356

@@ -365,7 +365,7 @@ describe('httpPollingDatafileManager', () => {
365365
manager.start()
366366
let didReject = false
367367
try {
368-
await manager.onReady
368+
await manager.onReady()
369369
} catch (e) {
370370
didReject = true
371371
}
@@ -392,7 +392,7 @@ describe('httpPollingDatafileManager', () => {
392392
manager.start()
393393
expect(makeGetRequestSpy).toBeCalledTimes(1)
394394
expect(makeGetRequestSpy.mock.calls[0][0]).toBe('https://localhost:5556/datafiles/456')
395-
await manager.onReady
395+
await manager.onReady()
396396
})
397397
})
398398
})

packages/datafile-manager/__test__/nodeDatafileManager.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ describe('nodeDatafileManager', () => {
5151
expect(makeGetRequestSpy.mock.calls[0][0]).toBe('https://cdn.optimizely.com/datafiles/1234.json')
5252
expect(makeGetRequestSpy.mock.calls[0][1]).toEqual({})
5353

54-
await manager.onReady
54+
await manager.onReady()
5555
await manager.stop()
5656
})
5757

@@ -72,7 +72,7 @@ describe('nodeDatafileManager', () => {
7272
timeoutFactory: testTimeoutFactory,
7373
})
7474
manager.start()
75-
await manager.onReady
75+
await manager.onReady()
7676
testTimeoutFactory.timeoutFns[0]()
7777
expect(makeGetRequestSpy).toBeCalledTimes(2)
7878
expect(makeGetRequestSpy.mock.calls[1][0]).toBe('https://cdn.optimizely.com/datafiles/1234.json')

packages/datafile-manager/src/datafileManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ interface Managed {
3434
export interface DatafileManager extends Managed {
3535
get: () => string | null
3636
on: (eventName: string, listener: DatafileUpdateListener) => () => void
37-
onReady: Promise<void>
37+
onReady: () => Promise<void>
3838
}
3939

4040
export enum CacheDirective {

packages/datafile-manager/src/httpPollingDatafileManager.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
3636
// The request will be aborted if the manager is stopped while the request is in flight.
3737
protected abstract makeGetRequest(reqUrl: string, headers: Headers): AbortableRequest
3838

39-
public readonly onReady: Promise<void>
40-
4139
private currentDatafile: string | null
4240

4341
private readonly sdkKey: string
4442

45-
private isOnReadySettled: boolean
43+
private readonly readyPromise: Promise<void>
44+
45+
private isReadyPromiseSettled: boolean
4646

47-
private onReadyResolver: () => void
47+
private readyPromiseResolver: () => void
4848

49-
private onReadyRejecter: (err: Error) => void
49+
private readyPromiseRejecter: (err: Error) => void
5050

5151
private readonly emitter: EventEmitter
5252

@@ -84,12 +84,12 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
8484
this.currentDatafile = null
8585
}
8686

87-
this.isOnReadySettled = false
88-
this.onReadyResolver = () => {}
89-
this.onReadyRejecter = () => {}
90-
this.onReady = new Promise((resolve, reject) => {
91-
this.onReadyResolver = resolve
92-
this.onReadyRejecter = reject
87+
this.isReadyPromiseSettled = false
88+
this.readyPromiseResolver = () => {}
89+
this.readyPromiseRejecter = () => {}
90+
this.readyPromise = new Promise((resolve, reject) => {
91+
this.readyPromiseResolver = resolve
92+
this.readyPromiseRejecter = reject
9393
})
9494

9595
this.isStarted = false
@@ -140,6 +140,10 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
140140
return Promise.resolve()
141141
}
142142

143+
onReady(): Promise<void> {
144+
return this.readyPromise
145+
}
146+
143147
on(eventName: string, listener: (datafileUpdate: DatafileUpdate) => void) {
144148
return this.emitter.on(eventName, listener)
145149
}
@@ -173,8 +177,8 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
173177
if (datafile !== null) {
174178
logger.info('Updating datafile from response')
175179
this.currentDatafile = datafile
176-
if (!this.isOnReadySettled) {
177-
this.resolveOnReady()
180+
if (!this.isReadyPromiseSettled) {
181+
this.resolveReadyPromise()
178182
} else if (this.liveUpdates) {
179183
const datafileUpdate: DatafileUpdate = {
180184
datafile,
@@ -194,9 +198,9 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
194198
if (this.liveUpdates) {
195199
this.scheduleNextUpdate()
196200
}
197-
if (!this.isOnReadySettled && !this.liveUpdates) {
201+
if (!this.isReadyPromiseSettled && !this.liveUpdates) {
198202
// We will never resolve ready, so reject it
199-
this.rejectOnReady(new Error('Failed to become ready'))
203+
this.rejectReadyPromise(new Error('Failed to become ready'))
200204
}
201205
}
202206

@@ -225,14 +229,14 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
225229
.then(onFetchComplete, onFetchComplete)
226230
}
227231

228-
private resolveOnReady(): void {
229-
this.onReadyResolver()
230-
this.isOnReadySettled = true
232+
private resolveReadyPromise(): void {
233+
this.readyPromiseResolver()
234+
this.isReadyPromiseSettled = true
231235
}
232236

233-
private rejectOnReady(err: Error): void {
234-
this.onReadyRejecter(err)
235-
this.isOnReadySettled = true
237+
private rejectReadyPromise(err: Error): void {
238+
this.readyPromiseRejecter(err)
239+
this.isReadyPromiseSettled = true
236240
}
237241

238242
private scheduleNextUpdate(): void {

0 commit comments

Comments
 (0)