Skip to content

Commit 93532c1

Browse files
authored
fix: persistent tracking queue flush when tracker set (#130)
1 parent fef53e5 commit 93532c1

File tree

2 files changed

+15
-23
lines changed

2 files changed

+15
-23
lines changed

packages/experiment-browser/src/integration/manager.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ export class IntegrationManager {
6161
if (integration.setup) {
6262
this.integration.setup(this.config, this.client).then(
6363
() => {
64-
this.queue.tracker = this.integration.track.bind(integration);
64+
this.queue.setTracker(this.integration.track.bind(integration));
6565
this.resolve();
6666
},
6767
(e) => {
6868
console.error('Integration setup failed.', e);
69-
this.queue.tracker = this.integration.track.bind(integration);
69+
this.queue.setTracker(this.integration.track.bind(integration));
7070
this.resolve();
7171
},
7272
);
7373
} else {
74-
this.queue.tracker = this.integration.track.bind(integration);
74+
this.queue.setTracker(this.integration.track.bind(integration));
7575
this.resolve();
7676
}
7777
}
@@ -170,20 +170,11 @@ export class PersistentTrackingQueue {
170170
private readonly maxQueueSize: number;
171171
private readonly isLocalStorageAvailable = isLocalStorageAvailable();
172172
private inMemoryQueue: ExperimentEvent[] = [];
173-
private poller: any | undefined;
174-
175-
tracker: ((event: ExperimentEvent) => boolean) | undefined;
173+
private tracker: ((event: ExperimentEvent) => boolean) | undefined;
176174

177175
constructor(instanceName: string, maxQueueSize: number = MAX_QUEUE_SIZE) {
178176
this.storageKey = `EXP_unsent_${instanceName}`;
179177
this.maxQueueSize = maxQueueSize;
180-
this.loadQueue();
181-
if (this.inMemoryQueue.length > 0) {
182-
this.poller = safeGlobal.setInterval(() => {
183-
this.loadFlushStore();
184-
}, 1000);
185-
}
186-
this.loadFlushStore();
187178
}
188179

189180
push(event: ExperimentEvent): void {
@@ -193,17 +184,18 @@ export class PersistentTrackingQueue {
193184
this.storeQueue();
194185
}
195186

187+
setTracker(tracker: (event: ExperimentEvent) => boolean): void {
188+
this.tracker = tracker;
189+
this.loadFlushStore();
190+
}
191+
196192
private flush(): void {
197193
if (!this.tracker) return;
198194
if (this.inMemoryQueue.length === 0) return;
199195
for (const event of this.inMemoryQueue) {
200196
if (!this.tracker(event)) return;
201197
}
202198
this.inMemoryQueue = [];
203-
if (this.poller) {
204-
safeGlobal.clearInterval(this.poller);
205-
this.poller = undefined;
206-
}
207199
}
208200

209201
private loadQueue(): void {

packages/experiment-browser/test/integration/manager.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,10 +323,10 @@ describe('PersistentTrackingQueue', () => {
323323
const instanceName = '$default_instance';
324324
const queue = new PersistentTrackingQueue(instanceName);
325325
const trackedEvents: ExperimentEvent[] = [];
326-
queue.tracker = (event) => {
326+
queue.setTracker((event) => {
327327
trackedEvents.push(event);
328328
return false;
329-
};
329+
});
330330
const event: ExperimentEvent = {
331331
eventType: '$exposure',
332332
eventProperties: {
@@ -354,10 +354,10 @@ describe('PersistentTrackingQueue', () => {
354354
const instanceName = '$default_instance';
355355
const queue = new PersistentTrackingQueue(instanceName);
356356
const trackedEvents: ExperimentEvent[] = [];
357-
queue.tracker = (event) => {
357+
queue.setTracker((event) => {
358358
trackedEvents.push(event);
359359
return true;
360-
};
360+
});
361361
const event: ExperimentEvent = {
362362
eventType: '$exposure',
363363
eventProperties: {
@@ -399,10 +399,10 @@ describe('PersistentTrackingQueue', () => {
399399
JSON.stringify([event]),
400400
);
401401

402-
queue.tracker = (event) => {
402+
queue.setTracker((event) => {
403403
trackedEvents.push(event);
404404
return true;
405-
};
405+
});
406406

407407
queue.push(event);
408408
expect(queue['inMemoryQueue']).toEqual([]);

0 commit comments

Comments
 (0)