Skip to content

Commit c0419c9

Browse files
committed
fix(flags): Enqueue follow up requests without dropping
1 parent 233e604 commit c0419c9

File tree

7 files changed

+34
-20
lines changed

7 files changed

+34
-20
lines changed

functional_tests/feature-flags.test.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,7 @@ test('person properties set in identify() with the same distinct_id are sent to
107107
})
108108
})
109109

110-
test('identify() doesnt trigger new request automatically if first request takes too long', async () => {
111-
// TODO: Make this experience nicer, and queue requests, rather than leave
112-
// it upto the user to call reloadFeatureFlags() manually.
113-
110+
test('identify() triggers new request in queue after first request', async () => {
114111
const token = v4()
115112
const posthog = await createPosthogInstance(token, { advanced_disable_decide: false })
116113

@@ -130,12 +127,28 @@ test('identify() doesnt trigger new request automatically if first request takes
130127
resetRequests(token)
131128

132129
// don't wait for decide callback
133-
134130
posthog.identify('test-id', {
135-
email: 'test@email.com',
131+
email: 'test2@email.com',
136132
})
137133

138134
await waitFor(() => {
139135
expect(getRequests(token)['/decide/']).toEqual([])
140136
})
137+
138+
// wait for decide callback
139+
// eslint-disable-next-line compat/compat
140+
await new Promise((res) => setTimeout(res, 500))
141+
142+
// now second call should've fired
143+
await waitFor(() => {
144+
expect(getRequests(token)['/decide/']).toEqual([
145+
{
146+
$anon_distinct_id: anonymousId,
147+
distinct_id: 'test-id',
148+
groups: {},
149+
person_properties: { email: '[email protected]' },
150+
token,
151+
},
152+
])
153+
})
141154
})

src/__tests__/compression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ describe('Payload Compression', () => {
9292
},
9393
featureFlags: {
9494
receivedFeatureFlags: jest.fn(),
95-
resetRequestQueue: jest.fn(),
9695
setReloadingPaused: jest.fn(),
96+
_startReloadTimer: jest.fn(),
9797
},
9898
_hasBootstrappedFeatureFlags: jest.fn(),
9999
get_property: (property_key) =>

src/__tests__/decide.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ describe('Decide', () => {
2727
},
2828
featureFlags: {
2929
receivedFeatureFlags: jest.fn(),
30-
resetRequestQueue: jest.fn(),
3130
setReloadingPaused: jest.fn(),
31+
_startReloadTimer: jest.fn(),
3232
},
3333
_hasBootstrappedFeatureFlags: jest.fn(),
3434
getGroups: () => ({ organization: '5' }),

src/__tests__/posthog-core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ describe('_loaded()', () => {
892892
capture: jest.fn(),
893893
featureFlags: {
894894
setReloadingPaused: jest.fn(),
895-
resetRequestQueue: jest.fn(),
895+
_startReloadTimer: jest.fn(),
896896
},
897897
_start_queue_if_opted_in: jest.fn(),
898898
}))

src/__tests__/posthog-core.loaded.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('loaded() with flags', () => {
1717
capture: jest.fn(),
1818
featureFlags: {
1919
setReloadingPaused: jest.fn(),
20-
resetRequestQueue: jest.fn(),
20+
_startReloadTimer: jest.fn(),
2121
receivedFeatureFlags: jest.fn(),
2222
},
2323
_start_queue_if_opted_in: jest.fn(),
@@ -48,24 +48,28 @@ describe('loaded() with flags', () => {
4848
beforeEach(() => {
4949
jest.spyOn(given.lib.featureFlags, 'setGroupPropertiesForFlags')
5050
jest.spyOn(given.lib.featureFlags, 'setReloadingPaused')
51-
jest.spyOn(given.lib.featureFlags, 'resetRequestQueue')
51+
jest.spyOn(given.lib.featureFlags, '_startReloadTimer')
5252
jest.spyOn(given.lib.featureFlags, '_reloadFeatureFlagsRequest')
5353
})
5454

5555
it('doesnt call flags while initial load is happening', () => {
5656
given.subject()
5757

58-
jest.runAllTimers()
58+
jest.runOnlyPendingTimers()
5959

6060
expect(given.lib.featureFlags.setGroupPropertiesForFlags).toHaveBeenCalled() // loaded ph.group() calls setGroupPropertiesForFlags
6161
expect(given.lib.featureFlags.setReloadingPaused).toHaveBeenCalledWith(true)
62-
expect(given.lib.featureFlags.resetRequestQueue).toHaveBeenCalledTimes(1)
62+
expect(given.lib.featureFlags._startReloadTimer).toHaveBeenCalled()
6363
expect(given.lib.featureFlags.setReloadingPaused).toHaveBeenCalledWith(false)
6464

65-
// even if the decide request returned late, we should not call _reloadFeatureFlagsRequest
65+
// we should call _reloadFeatureFlagsRequest for `group` only after the initial load
6666
// because it ought to be paused until decide returns
6767
expect(given.overrides._send_request).toHaveBeenCalledTimes(1)
6868
expect(given.lib.featureFlags._reloadFeatureFlagsRequest).toHaveBeenCalledTimes(0)
69+
70+
jest.runOnlyPendingTimers()
71+
expect(given.overrides._send_request).toHaveBeenCalledTimes(2)
72+
expect(given.lib.featureFlags._reloadFeatureFlagsRequest).toHaveBeenCalledTimes(1)
6973
})
7074
})
7175

@@ -74,7 +78,7 @@ describe('loaded() with flags', () => {
7478

7579
expect(given.overrides.featureFlags.setReloadingPaused).toHaveBeenCalledWith(true)
7680
expect(given.overrides.featureFlags.setReloadingPaused).toHaveBeenCalledWith(false)
77-
expect(given.overrides.featureFlags.resetRequestQueue).toHaveBeenCalledTimes(1)
81+
expect(given.overrides.featureFlags._startReloadTimer).toHaveBeenCalled()
7882
expect(given.overrides.featureFlags.receivedFeatureFlags).toHaveBeenCalledTimes(1)
7983
})
8084
})

src/decide.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ export class Decide {
3939
}
4040

4141
parseDecideResponse(response: DecideResponse): void {
42-
this.instance.featureFlags.resetRequestQueue()
4342
this.instance.featureFlags.setReloadingPaused(false)
43+
// :TRICKY: Reload - start another request if queued!
44+
this.instance.featureFlags._startReloadTimer()
4445

4546
if (response?.status === 0) {
4647
console.error('Failed to fetch feature flags from PostHog.')

src/posthog-featureflags.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,6 @@ export class PostHogFeatureFlags {
151151
this.reloadFeatureFlagsInAction = isPaused
152152
}
153153

154-
resetRequestQueue(): void {
155-
this.reloadFeatureFlagsQueued = false
156-
}
157-
158154
_startReloadTimer(): void {
159155
if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {
160156
setTimeout(() => {

0 commit comments

Comments
 (0)