insertEvent method

Future<void> insertEvent(
  1. Map<String, dynamic> event, {
  2. List<EventModifier> defaultEventModifiers = const [ValidationModifier()],
  3. ReportEventOverride? reportEventOverride,
})

Inserts event into processor, filters event through the chain of modifiers

Implementation

Future<void> insertEvent(
  Map<String, dynamic> event, {
  List<EventModifier> defaultEventModifiers = const [ValidationModifier()],
  ReportEventOverride? reportEventOverride,
}) async {
  if (!isEnabled) {
    Logger().i(_tag, 'RUM on Grail is disabled, dropping event.', logType: LogType.Warning);
    return;
  }

  // Normalize and cast duration to an int
  var cachedDuration = event[BasicKeys.duration] ?? 0;
  final hasNfnDuration = cachedDuration is double && (cachedDuration.isNaN || cachedDuration.isInfinite);
  if (hasNfnDuration) {
    cachedDuration = 0;
    _overriddenKeys.add(BasicKeys.duration);
  }
  final cachedDurationInt = (cachedDuration is num) ? cachedDuration.toInt() : 0;

  event.remove(BasicKeys.duration);
  final startTime = Clock.agentClock().nowMillis();

  final originalEvent = BasicEvent(
    duration: cachedDurationInt,
    startTime: startTime - cachedDurationInt,
  ).toMap()
    ..addAll(event);

  var eventToSend = Map<String, dynamic>.from(originalEvent);
  if (hasNfnDuration) {
    eventToSend[DtRumKeys.hasNfnValues] = true;
  }
  // Apply event enrichments
  for (final enrichment in _eventEnrichments) {
    try {
      eventToSend = await enrichment.enrichEvent(eventToSend);
    } catch (_) {
      // In case of error during modification add field to the event
      eventToSend[DtRumKeys.hasEnrichException] = true;
    }
  }

  // Apply custom event modifiers
  for (final modifier in _customEventModifiers) {
    try {
      eventToSend = modifier.modifyEvent(eventToSend) ?? {};
      _writeOverriddenKeys(originalEvent, eventToSend);
    } catch (_) {
      // In case of error during modification add field to the event
      eventToSend[DtRumKeys.hasEnrichException] = true;
    }
  }
  eventToSend = _restoreCachedEvent(eventToSend, originalEvent);
  // Overridden keys are written to event
  if (_overriddenKeys.isNotEmpty) {
    eventToSend[DtRumKeys.overriddenFields] = _overriddenKeys.toList();
  }
  // Apply default event modifiers
  for (final modifier in defaultEventModifiers) {
    eventToSend = modifier.modifyEvent(eventToSend) ?? {};
  }
  eventToSend = _trimMap(eventToSend);
  final hasEventProperties = eventToSend.keys.any(
    (element) => element.startsWith(eventProperties),
  );
  if (hasEventProperties) {
    eventToSend[CharacteristicsKeys.hasEventProperties] = true;
  }
  final effectiveReporter = reportEventOverride ?? _thirdGenApi.reportThirdGenEvent;
  final json = jsonEncode(eventToSend);
  Logger().d(_tag, 'Reporting event: $json');
  await effectiveReporter(json);
}