import 'package:mutex/mutex.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:simplecloudnotifier/api/api_client.dart'; import 'package:simplecloudnotifier/models/channel.dart'; import 'package:simplecloudnotifier/models/client.dart'; import 'package:simplecloudnotifier/models/keytoken.dart'; import 'package:simplecloudnotifier/models/scn_message.dart'; import 'package:simplecloudnotifier/state/application_log.dart'; import 'package:simplecloudnotifier/state/fb_message.dart'; import 'package:simplecloudnotifier/state/globals.dart'; import 'package:simplecloudnotifier/state/request_log.dart'; import 'package:simplecloudnotifier/state/app_auth.dart'; final lockHive = Mutex(); void setFirebaseToken(String fcmToken) async { final acc = AppAuth(); final oldToken = Globals().getPrefFCMToken(); await Globals().setPrefFCMToken(fcmToken); ApplicationLog.info('New firebase token received', additional: 'Token: $fcmToken (old: $oldToken)'); if (!acc.isAuth()) return; Client? client; try { client = await acc.loadClient(forceIfOlder: Duration(seconds: 60)); } catch (exc, trace) { ApplicationLog.error('Failed to get client: ' + exc.toString(), trace: trace); return; } if (oldToken != null && oldToken == fcmToken && client != null && client.fcmToken == fcmToken) { ApplicationLog.info('Firebase token unchanged - do nothing', additional: 'Token: $fcmToken'); return; } if (client == null) { // should not really happen - perhaps someone externally deleted the client? final newClient = await APIClient.addClient(acc, fcmToken, Globals().deviceModel, Globals().version, Globals().hostname, Globals().clientType); acc.setClientAndClientID(newClient); await acc.save(); } else { final newClient = await APIClient.updateClient(acc, client.clientID, fcmToken: fcmToken, agentModel: Globals().deviceModel, name: Globals().hostname, agentVersion: Globals().version); acc.setClientAndClientID(newClient); await acc.save(); } } Future initHive() async { await lockHive.protect(() async { if (Globals().hiveAdaptersRegistered) return; await Hive.initFlutter(); Globals().hiveInitialized = true; }); } Future openHiveBoxes(bool safe) async { await lockHive.protect(() async { if (Globals().hiveBoxesOpened) return; if (!safe) { await Hive.openBox('scn-logs'); await Hive.openBox('scn-requests'); await Hive.openBox('scn-message-cache'); await Hive.openBox('scn-channel-cache'); await Hive.openBox('scn-fb-messages'); await Hive.openBox('scn-keytoken-value-cache'); Globals().hiveBoxesOpened = true; return; } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-logs'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-logs'); await Hive.openBox('scn-logs'); ApplicationLog.error('Failed to open Hive-Box: scn-logs: ' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-logs', {'error': exc.toString(), 'trace': trace}); } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-requests'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-requests'); await Hive.openBox('scn-requests'); ApplicationLog.error('Failed to open Hive-Box: scn-requests: ' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-requests', {'error': exc.toString(), 'trace': trace}); } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-message-cache'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-message-cache'); await Hive.openBox('scn-message-cache'); ApplicationLog.error('Failed to open Hive-Box: scn-message-cache' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-message-cache', {'error': exc.toString(), 'trace': trace}); } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-channel-cache'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-channel-cache'); await Hive.openBox('scn-channel-cache'); ApplicationLog.error('Failed to open Hive-Box: scn-channel-cache' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-channel-cache', {'error': exc.toString(), 'trace': trace}); } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-fb-messages'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-fb-messages'); await Hive.openBox('scn-fb-messages'); ApplicationLog.error('Failed to open Hive-Box: scn-fb-messages' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-fb-messages', {'error': exc.toString(), 'trace': trace}); } try { print('[INIT] Load Hive...'); await Hive.openBox('scn-keytoken-value-cache'); } catch (exc, trace) { Hive.deleteBoxFromDisk('scn-keytoken-value-cache'); await Hive.openBox('scn-keytoken-value-cache'); ApplicationLog.error('Failed to open Hive-Box: scn-keytoken-value-cache' + exc.toString(), trace: trace); ApplicationLog.writeRawFailure('Failed to open Hive-Box: scn-keytoken-value-cache', {'error': exc.toString(), 'trace': trace}); } Globals().hiveBoxesOpened = true; }); } Future registerHiveAdapter() async { await lockHive.protect(() async { if (Globals().hiveAdaptersRegistered) return; Hive.registerAdapter(SCNRequestAdapter()); Hive.registerAdapter(SCNLogAdapter()); Hive.registerAdapter(SCNLogLevelAdapter()); Hive.registerAdapter(SCNMessageAdapter()); Hive.registerAdapter(ChannelAdapter()); Hive.registerAdapter(FBMessageAdapter()); Hive.registerAdapter(KeyTokenAdapter()); Globals().hiveAdaptersRegistered = true; }); }