toCompactStringEvent static method

String toCompactStringEvent(
  1. Event event
)

Serialize event to compact NDJSON-ready string (flat structure). Core SDK fields are written last to prevent userProperties or eventParams from accidentally overwriting them.

Implementation

static String toCompactStringEvent(Event event) {
  final flat = <String, dynamic>{};

  // User properties first (lowest priority in case of key collision)
  // Sanitize to prevent NaN/Infinity crashing jsonEncode.
  if (event.userProperties != null) {
    final sanitizedUserProps = JsonSanitizer.sanitize(
      Map<String, dynamic>.from(event.userProperties!),
    );
    for (final entry in sanitizedUserProps.entries) {
      flat[entry.key] = entry.value;
    }
  }

  // Event params next (can overwrite user properties but not core fields)
  if (event.eventParams != null) {
    flat.addAll(
      JsonSanitizer.sanitize(event.eventParams!.cast<String, dynamic>()),
    );
  }

  // Core SDK fields last (highest priority — never overwritten)
  flat['_ts'] = event.ts;
  flat['event_name'] = event.eventName;
  flat['install_day'] = event.installDay;
  flat['user_pseudo_id'] = event.userPseudoId;
  flat['retention_day'] = event.retentionDay;
  flat['retention_hour'] = event.retentionHour;
  flat['retention_minute'] = event.retentionMinute;
  flat['session_id'] = event.sessionId;
  flat['session_progress'] = event.sessionProgress;
  flat['session_number'] = event.sessionNumber;
  flat['event_date'] = event.eventDate;
  flat['event_local_day_of_week'] = event.eventLocalDayOfWeek;
  flat['event_local_hour'] = event.eventLocalHour;
  flat['event_local_hour_minute'] = event.eventLocalHourMinute;
  flat['sdk_ver'] = event.sdkVer;
  flat['sdk_ver_num'] = event.sdkVerNum;
  flat['engagement_time_msec'] = event.engagementTimeMsec;

  return jsonEncode(flat);
}