Skip to content

Commit 9e947b4

Browse files
tyiuhccursoragent
andcommitted
fix: clear pendingWrites on RelayClient destroy
Teardown resets the ephemeral write queue so stale events are not flushed after re-init on the same instance. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 320f547 commit 9e947b4

2 files changed

Lines changed: 27 additions & 0 deletions

File tree

packages/experiment-tag/src/behavioral-targeting/relay-client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ export class RelayClient {
255255
this.iframeWindow = null;
256256
this.available = false;
257257
this.ready = false;
258+
this.pendingWrites = [];
258259
this.initPromise = null;
259260
}
260261
}

packages/experiment-tag/test/behavioral-targeting/relay-client.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,32 @@ describe('RelayClient', () => {
192192
expect(document.querySelectorAll('iframe')).toHaveLength(1);
193193
});
194194

195+
test('queued writes before destroy are cleared on teardown', async () => {
196+
const { client, iframeWindow, postMessage } = setupClient();
197+
client.writeEvent({
198+
id: 42,
199+
event_type: 'page_view',
200+
timestamp: 100,
201+
session_id: 's1',
202+
properties: {},
203+
});
204+
205+
const initPromise = client.init();
206+
client.destroy();
207+
await initPromise;
208+
209+
const reinitPromise = client.init();
210+
signalRelayReady(iframeWindow);
211+
await reinitPromise;
212+
213+
expect(postMessage).not.toHaveBeenCalledWith(
214+
expect.objectContaining({
215+
type: 'WRITE_EVENT',
216+
payload: { event: expect.objectContaining({ id: 42 }) },
217+
}),
218+
);
219+
});
220+
195221
test('writeEvent after destroy is dropped', async () => {
196222
const { client, iframeWindow, postMessage } = setupClient();
197223
const initPromise = client.init();

0 commit comments

Comments
 (0)