storeEvent method

Future<void> storeEvent(
  1. Map<String, dynamic> event
)

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;
    }
  }
}