From 74a913a0602c6776cbf3f3e07b9d3fcc69543e92 Mon Sep 17 00:00:00 2001 From: Gauthier Petetin Date: Fri, 29 May 2026 15:27:33 +0200 Subject: [PATCH 1/2] fix: clear analytics queue on callback errors --- .../src/AnalyticsController.test.ts | 16 +++------------- .../src/AnalyticsController.ts | 1 - 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/analytics-controller/src/AnalyticsController.test.ts b/packages/analytics-controller/src/AnalyticsController.test.ts index 638683998a..377dcae63e 100644 --- a/packages/analytics-controller/src/AnalyticsController.test.ts +++ b/packages/analytics-controller/src/AnalyticsController.test.ts @@ -1301,7 +1301,7 @@ describe('AnalyticsController', () => { expect(controller.state.eventQueue).toStrictEqual({}); }); - it('keeps queued payloads when the adapter callback receives an error', async () => { + it('clears queued payloads when the adapter callback receives an error', async () => { const mockAdapter = createMockAdapter(); const { controller } = await setupController({ state: { @@ -1317,14 +1317,7 @@ describe('AnalyticsController', () => { const deliveryOptions = getDeliveryOptions(mockAdapter.track); deliveryOptions.callback?.(new Error('Segment failed')); - const [messageId] = Object.keys(controller.state.eventQueue ?? {}); - - expect(controller.state.eventQueue).toHaveProperty(messageId); - expect(controller.state.eventQueue?.[messageId]).toMatchObject({ - type: 'track', - eventName: 'test_event', - properties: { prop: 'value' }, - }); + expect(controller.state.eventQueue).toStrictEqual({}); }); it('keeps queued payloads when the platform adapter throws', async () => { @@ -1360,7 +1353,7 @@ describe('AnalyticsController', () => { let adapterMutationCompleted = false; jest .spyOn(mockAdapter, 'track') - .mockImplementation((_eventName, properties, context, options) => { + .mockImplementation((_eventName, properties, context) => { ( properties as { nested: { adapterNormalized?: boolean } } ).nested.adapterNormalized = true; @@ -1368,9 +1361,6 @@ describe('AnalyticsController', () => { context as { page: { adapterNormalized?: boolean } } ).page.adapterNormalized = true; adapterMutationCompleted = true; - (options as AnalyticsDeliveryOptions).callback?.( - new Error('Segment failed'), - ); }); const { controller } = await setupController({ state: { diff --git a/packages/analytics-controller/src/AnalyticsController.ts b/packages/analytics-controller/src/AnalyticsController.ts index 88a254e4b4..0981690487 100644 --- a/packages/analytics-controller/src/AnalyticsController.ts +++ b/packages/analytics-controller/src/AnalyticsController.ts @@ -555,7 +555,6 @@ export class AnalyticsController extends BaseController< messageId: queuedEvent.messageId, error, }); - return; } this.#removeQueuedEvent(queuedEvent.messageId); From 18ab987f59336848c2dc1d45b7cd5059ba103b48 Mon Sep 17 00:00:00 2001 From: Gauthier Petetin Date: Fri, 29 May 2026 15:54:37 +0200 Subject: [PATCH 2/2] docs: add analytics controller changelog entry --- packages/analytics-controller/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/analytics-controller/CHANGELOG.md b/packages/analytics-controller/CHANGELOG.md index a4491d304d..5240eaed16 100644 --- a/packages/analytics-controller/CHANGELOG.md +++ b/packages/analytics-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Clear persisted analytics event queue entries after the delivery callback runs, including when the callback reports an error. ([#8934](https://github.com/MetaMask/core/pull/8934)) + ## [1.1.0] ### Added