improved error logging and handling

This commit is contained in:
Fabian Freund
2026-01-21 11:07:23 +01:00
parent f648c43441
commit dc4a5a9c85
35 changed files with 242 additions and 115 deletions
@@ -47,9 +47,14 @@ class SelectedTab extends _$SelectedTab {
},
);
final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) {
state = tabId;
});
final selectedTabSub = eventSerivce.selectedTabEvents.listen(
(tabId) {
state = tabId;
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in selected tab events', error: error, stackTrace: stackTrace);
},
);
ref.onDispose(() async {
await selectedTabSub.cancel();
@@ -41,7 +41,7 @@ final class SelectedTabProvider
}
}
String _$selectedTabHash() => r'26d1bb90c777d7011f4f27f7b962584a4a62a0a7';
String _$selectedTabHash() => r'5caa359376e9103767e2d2e94c548d53cba79d0f';
abstract class _$SelectedTab extends $Notifier<String?> {
String? build();
@@ -48,13 +48,18 @@ class TabList extends _$TabList {
},
);
final tabListSub = eventService.tabListEvents.listen((tabs) {
final equatableTabs = EquatableValue(tabs);
final tabListSub = eventService.tabListEvents.listen(
(tabs) {
final equatableTabs = EquatableValue(tabs);
if (equatableTabs != state) {
state = equatableTabs;
}
});
if (equatableTabs != state) {
state = equatableTabs;
}
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in tab list events', error: error, stackTrace: stackTrace);
},
);
ref.onDispose(() async {
await tabListSub.cancel();
@@ -41,7 +41,7 @@ final class TabListProvider
}
}
String _$tabListHash() => r'0b9ca1e089a59895df4cbf28691c2849a7004f08';
String _$tabListHash() => r'88c2598a4d586fee9e3d0f1b418cf88ea5c7da75';
abstract class _$TabList extends $Notifier<EquatableValue<List<String>>> {
EquatableValue<List<String>> build();
@@ -218,29 +218,64 @@ class TabStates extends _$TabStates {
final eventService = ref.watch(eventServiceProvider);
final subscriptions = [
eventService.tabContentEvents.listen((event) async {
await _onTabContentStateChange(event);
}),
eventService.iconChangeEvents.listen((event) async {
await _onIconChange(event);
}),
eventService.thumbnailEvents.listen((event) async {
await _onThumbnailChange(event);
}),
eventService.securityInfoEvents.listen((event) {
_onSecurityInfoStateChange(event);
}),
eventService.historyEvents.listen((event) {
_onHistoryStateChange(event);
}),
eventService.readerableEvents.listen((event) {
_onReaderableStateChange(event);
}),
eventService.tabContentEvents.listen(
(event) async {
await _onTabContentStateChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in tab content events', error: error, stackTrace: stackTrace);
},
),
eventService.iconChangeEvents.listen(
(event) async {
await _onIconChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in icon change events', error: error, stackTrace: stackTrace);
},
),
eventService.thumbnailEvents.listen(
(event) async {
await _onThumbnailChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in thumbnail events', error: error, stackTrace: stackTrace);
},
),
eventService.securityInfoEvents.listen(
(event) {
_onSecurityInfoStateChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in security info events', error: error, stackTrace: stackTrace);
},
),
eventService.historyEvents.listen(
(event) {
_onHistoryStateChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in history events', error: error, stackTrace: stackTrace);
},
),
eventService.readerableEvents.listen(
(event) {
_onReaderableStateChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in readerable events', error: error, stackTrace: stackTrace);
},
),
eventService.findResultsEvent
.debounceTime(const Duration(milliseconds: 25))
.listen((event) {
_onFindResultsChange(event);
}),
.listen(
(event) {
_onFindResultsChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in find results events', error: error, stackTrace: stackTrace);
},
),
];
ref.listen(
@@ -41,7 +41,7 @@ final class TabStatesProvider
}
}
String _$tabStatesHash() => r'67b497304b4137ce0115a66f06f3622c86e5727d';
String _$tabStatesHash() => r'985d2eb87c59c3a113b8bbcf9d96267c42a2f543';
abstract class _$TabStates extends $Notifier<Map<String, TabState>> {
Map<String, TabState> build();
@@ -23,6 +23,7 @@ import 'dart:ui';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:nullability/nullability.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/domain/entities/equatable_image.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/web_extension.dart';
import 'package:weblibre/features/geckoview/domain/providers.dart';
@@ -100,20 +101,40 @@ class WebExtensionsState extends _$WebExtensionsState {
final subscriptions = switch (actionType) {
WebExtensionActionType.browser => [
addonService.browserExtensionStream.listen((event) {
_onExtensionUpdate(event);
}),
addonService.browserIconStream.listen((event) async {
await _onIconChange(event);
}),
addonService.browserExtensionStream.listen(
(event) {
_onExtensionUpdate(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in browser extension stream', error: error, stackTrace: stackTrace);
},
),
addonService.browserIconStream.listen(
(event) async {
await _onIconChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in browser icon stream', error: error, stackTrace: stackTrace);
},
),
],
WebExtensionActionType.page => [
addonService.pageExtensionStream.listen((event) {
_onExtensionUpdate(event);
}),
addonService.pageIconStream.listen((event) async {
await _onIconChange(event);
}),
addonService.pageExtensionStream.listen(
(event) {
_onExtensionUpdate(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in page extension stream', error: error, stackTrace: stackTrace);
},
),
addonService.pageIconStream.listen(
(event) async {
await _onIconChange(event);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in page icon stream', error: error, stackTrace: stackTrace);
},
),
],
};
@@ -62,7 +62,7 @@ final class WebExtensionsStateProvider
}
String _$webExtensionsStateHash() =>
r'2664a50bb776197010e9da9b4e3a9379c849ba75';
r'd74f739a2f33395c10e30a81c8031f2f2630e418';
final class WebExtensionsStateFamily extends $Family
with
@@ -424,16 +424,21 @@ class TabRepository extends _$TabRepository {
final db = ref.watch(tabDatabaseProvider);
final tabAddedSub = eventSerivce.tabAddedStream.listen((tabId) async {
final containerId = ref.read(selectedContainerProvider);
await db.tabDao.insertTab(
tabId,
parentId: const Value.absent(),
source: TabSource.addedEvent,
containerId: Value(containerId),
isPrivate: const Value.absent(),
);
});
final tabAddedSub = eventSerivce.tabAddedStream.listen(
(tabId) async {
final containerId = ref.read(selectedContainerProvider);
await db.tabDao.insertTab(
tabId,
parentId: const Value.absent(),
source: TabSource.addedEvent,
containerId: Value(containerId),
isPrivate: const Value.absent(),
);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in tab added stream', error: error, stackTrace: stackTrace);
},
);
final containerSiteAssignementSub = eventSerivce.siteAssignementEvent.listen((
event,
@@ -522,20 +527,27 @@ class TabRepository extends _$TabRepository {
logger.w('Could not get tab for assignement ${tabState?.url}');
}
}
});
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in container site assignment stream', error: error, stackTrace: stackTrace);
},
);
final tabContentSub = tabContentService.tabContentStream.listen((
content,
) async {
await db.tabDao.updateTabContent(
content.tabId,
isProbablyReaderable: content.isProbablyReaderable,
extractedContentMarkdown: content.extractedContentMarkdown,
extractedContentPlain: content.extractedContentPlain,
fullContentMarkdown: content.fullContentMarkdown,
fullContentPlain: content.fullContentPlain,
);
});
final tabContentSub = tabContentService.tabContentStream.listen(
(content) async {
await db.tabDao.updateTabContent(
content.tabId,
isProbablyReaderable: content.isProbablyReaderable,
extractedContentMarkdown: content.extractedContentMarkdown,
extractedContentPlain: content.extractedContentPlain,
fullContentMarkdown: content.fullContentMarkdown,
fullContentPlain: content.fullContentPlain,
);
},
onError: (Object error, StackTrace stackTrace) {
logger.e('Error in tab content stream', error: error, stackTrace: stackTrace);
},
);
ref.listen(
fireImmediately: true,
@@ -545,7 +557,7 @@ class TabRepository extends _$TabRepository {
await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
}
},
onError: (error, stackTrace) {
onError: (Object error, StackTrace stackTrace) {
logger.e(
'Error listening to selectedTabProvider',
error: error,
@@ -565,7 +577,7 @@ class TabRepository extends _$TabRepository {
await db.tabDao.syncTabs(retainTabIds: next.value);
}
},
onError: (error, stackTrace) {
onError: (Object error, StackTrace stackTrace) {
logger.e(
'Error listening to tabListProvider',
error: error,
@@ -591,7 +603,7 @@ class TabRepository extends _$TabRepository {
await db.tabDao.updateTabs(debounceStartValue, next);
});
},
onError: (error, stackTrace) {
onError: (Object error, StackTrace stackTrace) {
logger.e(
'Error listening to tabStatesProvider',
error: error,
@@ -41,7 +41,7 @@ final class TabRepositoryProvider
}
}
String _$tabRepositoryHash() => r'763f5ea734abc854dfdc0c08d3f266fbd94bf931';
String _$tabRepositoryHash() => r'ff8ce73a65d408587cfb41e1920332d15ddff55f';
abstract class _$TabRepository extends $Notifier<void> {
void build();