Skip to content

Commit d8a47ce

Browse files
authored
fix: now hydration event is being returned if revision does not exist in cache (#9203)
Now when customer is coming with revision ID that does not exist in cache, we return hydration.
1 parent 96dac84 commit d8a47ce

File tree

3 files changed

+79
-5
lines changed

3 files changed

+79
-5
lines changed

src/lib/features/client-feature-toggles/delta/client-feature-delta-api.e2e.test.ts

+51
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,54 @@ test('should get segment updated and removed events', async () => {
270270
],
271271
});
272272
});
273+
274+
test('should return hydration if revision not in cache', async () => {
275+
await app.createFeature('base_feature');
276+
await syncRevisions();
277+
const { body, headers } = await app.request
278+
.get('/api/client/delta')
279+
.expect(200);
280+
const etag = headers.etag;
281+
282+
expect(body).toMatchObject({
283+
events: [
284+
{
285+
type: DELTA_EVENT_TYPES.HYDRATION,
286+
features: [
287+
{
288+
name: 'base_feature',
289+
},
290+
],
291+
},
292+
],
293+
});
294+
295+
await app.createFeature('not_important1');
296+
await syncRevisions();
297+
298+
const { body: deltaBody } = await app.request
299+
.get('/api/client/delta')
300+
.set('If-None-Match', etag)
301+
.expect(200);
302+
303+
expect(deltaBody).toMatchObject({
304+
events: [
305+
{
306+
type: DELTA_EVENT_TYPES.FEATURE_UPDATED,
307+
},
308+
],
309+
});
310+
311+
const { body: rehydrationBody } = await app.request
312+
.get('/api/client/delta')
313+
.set('If-None-Match', '1')
314+
.expect(200);
315+
316+
expect(rehydrationBody).toMatchObject({
317+
events: [
318+
{
319+
type: DELTA_EVENT_TYPES.HYDRATION,
320+
},
321+
],
322+
});
323+
});

src/lib/features/client-feature-toggles/delta/client-feature-toggle-delta.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,12 @@ export class ClientFeatureToggleDelta {
154154
if (requiredRevisionId >= this.currentRevisionId) {
155155
return undefined;
156156
}
157-
if (requiredRevisionId === 0) {
158-
const hydrationEvent = this.delta[environment].getHydrationEvent();
157+
const delta = this.delta[environment];
158+
if (
159+
requiredRevisionId === 0 ||
160+
delta.isMissingRevision(requiredRevisionId)
161+
) {
162+
const hydrationEvent = delta.getHydrationEvent();
159163
const filteredEvent = filterHydrationEventByQuery(
160164
hydrationEvent,
161165
projects,
@@ -168,7 +172,7 @@ export class ClientFeatureToggleDelta {
168172

169173
return Promise.resolve(response);
170174
} else {
171-
const environmentEvents = this.delta[environment].getEvents();
175+
const environmentEvents = delta.getEvents();
172176
const events = filterEventsByQuery(
173177
environmentEvents,
174178
requiredRevisionId,
@@ -299,8 +303,7 @@ export class ClientFeatureToggleDelta {
299303
});
300304
}
301305

302-
public async initEnvironmentDelta(environment: string) {
303-
// Todo: replace with method that gets all features for an environment
306+
private async initEnvironmentDelta(environment: string) {
304307
const baseFeatures = await this.getClientFeatures({
305308
environment,
306309
});

src/lib/features/client-feature-toggles/delta/delta-cache.ts

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,22 @@ export class DeltaCache {
1212
constructor(hydrationEvent: DeltaHydrationEvent, maxLength: number = 20) {
1313
this.hydrationEvent = hydrationEvent;
1414
this.maxLength = maxLength;
15+
16+
this.addBaseEventFromHydration(hydrationEvent);
17+
}
18+
19+
private addBaseEventFromHydration(
20+
hydrationEvent: DeltaHydrationEvent,
21+
): void {
22+
const lastFeature =
23+
hydrationEvent.features[hydrationEvent.features.length - 1];
24+
this.addEvents([
25+
{
26+
eventId: hydrationEvent.eventId,
27+
type: 'feature-updated',
28+
feature: lastFeature,
29+
},
30+
]);
1531
}
1632

1733
public addEvents(events: DeltaEvent[]): void {
@@ -27,6 +43,10 @@ export class DeltaCache {
2743
return this.events;
2844
}
2945

46+
public isMissingRevision(revisionId: number): boolean {
47+
return !this.events.some((event) => event.eventId === revisionId);
48+
}
49+
3050
public getHydrationEvent(): DeltaHydrationEvent {
3151
return this.hydrationEvent;
3252
}

0 commit comments

Comments
 (0)