storeEvent method
Almacena un evento con técnicas defensivas
Implementation
Future<void> storeEvent(Map<String, dynamic> event) async {
if (!_isInitialized) {
await initialize();
}
try {
// Añadir metadata para control
final eventWithMetadata = {
...event,
'_stored_at': DateTime.now().millisecondsSinceEpoch,
'_session_id': event['session_id'],
'_sequence': event['sequence'],
};
final key = _generateEventKey(event);
if (_useHive && _eventsBox != null) {
await _storeInHive(key, eventWithMetadata);
} else if (_prefs != null) {
await _storeInSharedPreferences(key, eventWithMetadata);
} else {
throw Exception('No storage available');
}
// Verificar límites de buffer
await _checkBufferLimits();
// Emit storage event for real-time updates
_storageEventsController.add(StorageEvent(
type: StorageEventType.eventStored,
eventData: eventWithMetadata,
metadata: {
'storage_type': _useHive ? 'hive' : 'shared_preferences',
'event_key': key,
},
));
} catch (e) {
ObslyLogger.error('Error storing event: $e');
// Intentar fallback si el storage primario falla
if (_useHive) {
ObslyLogger.warn('Attempting fallback to SharedPreferences');
await _initializeSharedPreferences();
_useHive = false;
await storeEvent(event); // Reintentar
} else {
rethrow;
}
}
}