From 944029d16c4b3e55fed9bb4e8b71495bec4895b3 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 12 Jan 2026 10:04:33 +0700 Subject: [PATCH] TF-4136 Move Sentry duplication guard, but keep interceptor ordering last (not first) --- core/lib/utils/application_manager.dart | 2 +- core/lib/utils/sentry/sentry_initializer.dart | 6 ++++++ core/lib/utils/sentry/sentry_manager.dart | 4 ++++ lib/features/base/mixin/ai_scribe_mixin.dart | 4 ++-- .../home/domain/extensions/session_extensions.dart | 4 ++-- lib/main/bindings/network/network_bindings.dart | 7 ++++++- lib/main/bindings/network/network_isolate_binding.dart | 7 ++++++- 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/core/lib/utils/application_manager.dart b/core/lib/utils/application_manager.dart index f68b575fb..7d7683513 100644 --- a/core/lib/utils/application_manager.dart +++ b/core/lib/utils/application_manager.dart @@ -56,7 +56,7 @@ class ApplicationManager { log('ApplicationManager:getAppVersion -> cached: $version'); return version; } catch (e) { - logWarning('ApplicationManager:getAppVersion failedd, Exception = $e'); + logWarning('ApplicationManager:getAppVersion failed, Exception = $e'); return ''; } } diff --git a/core/lib/utils/sentry/sentry_initializer.dart b/core/lib/utils/sentry/sentry_initializer.dart index 73d5918bd..8a5c827fc 100644 --- a/core/lib/utils/sentry/sentry_initializer.dart +++ b/core/lib/utils/sentry/sentry_initializer.dart @@ -10,6 +10,10 @@ class SentryInitializer { 'set-cookie', 'x-auth', 'x-token', + 'api-key', + 'apikey', + 'secret', + 'bearer', ]; static Future init(FutureOr Function() appRunner) async { @@ -63,6 +67,8 @@ class SentryInitializer { data: null, ); + // Note: The copyWith method is deprecated, + // so values must be assigned directly to the instance. return SentryEvent( eventId: event.eventId, contexts: event.contexts, diff --git a/core/lib/utils/sentry/sentry_manager.dart b/core/lib/utils/sentry/sentry_manager.dart index 999f28adf..d29e85085 100644 --- a/core/lib/utils/sentry/sentry_manager.dart +++ b/core/lib/utils/sentry/sentry_manager.dart @@ -20,6 +20,10 @@ class SentryManager { required FutureOr Function() fallBackRunner, }) async { try { + if (_isSentryAvailable) { + log('[SentryManager] Already initialized, skipping'); + return; + } _isSentryAvailable = await SentryInitializer.init(appRunner); log('[SentryManager] Sentry initialized: $_isSentryAvailable'); } catch (e, st) { diff --git a/lib/features/base/mixin/ai_scribe_mixin.dart b/lib/features/base/mixin/ai_scribe_mixin.dart index f46f4ba60..6f422fd6e 100644 --- a/lib/features/base/mixin/ai_scribe_mixin.dart +++ b/lib/features/base/mixin/ai_scribe_mixin.dart @@ -38,8 +38,8 @@ mixin AiScribeMixin { if (aiCapability?.isScribeEndpointAvailable == true) { AIScribeBindings(aiCapability!.scribeEndpoint!).dependencies(); } - } catch (e) { - logWarning('AiScribeMixin::injectAIScribeBindings(): $e'); + } catch (e, st) { + logWarning('AiScribeMixin::injectAIScribeBindings(): $e\n$st'); } } } diff --git a/lib/features/home/domain/extensions/session_extensions.dart b/lib/features/home/domain/extensions/session_extensions.dart index ee92f2224..64e7f539a 100644 --- a/lib/features/home/domain/extensions/session_extensions.dart +++ b/lib/features/home/domain/extensions/session_extensions.dart @@ -194,8 +194,8 @@ extension SessionExtensions on Session { ); log('SessionExtensions::getAICapability:aiCapability = $aiCapability'); return aiCapability; - } catch (e) { - logWarning('SessionExtensions::getAICapability():[Exception] $e'); + } catch (e, st) { + logWarning('SessionExtensions::getAICapability():[Exception] ${e.runtimeType}\n$st'); return null; } } diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 615f9bf4b..ebad60955 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -103,7 +103,12 @@ class NetworkBindings extends Bindings { dio.interceptors.add(LogInterceptor(requestBody: true)); } if (SentryManager.instance.isSentryAvailable) { - dio.addSentry(); + // Guard against duplicate Sentry interceptor registration + final alreadyHasSentry = dio.interceptors + .any((i) => i.runtimeType.toString().contains('Sentry')); + if (!alreadyHasSentry) { + dio.addSentry(); + } } } diff --git a/lib/main/bindings/network/network_isolate_binding.dart b/lib/main/bindings/network/network_isolate_binding.dart index a443483d8..f80a209fd 100644 --- a/lib/main/bindings/network/network_isolate_binding.dart +++ b/lib/main/bindings/network/network_isolate_binding.dart @@ -68,7 +68,12 @@ class NetworkIsolateBindings extends Bindings { dio.interceptors.add(LogInterceptor(requestBody: true)); } if (SentryManager.instance.isSentryAvailable) { - dio.addSentry(); + // Guard against duplicate Sentry interceptor registration + final alreadyHasSentry = dio.interceptors + .any((i) => i.runtimeType.toString().contains('Sentry')); + if (!alreadyHasSentry) { + dio.addSentry(); + } } }