sendEvents method

Future sendEvents(
  1. List<RawEvent> events
)

Implementation

Future sendEvents(List<RawEvent> events) async {
  if (events.isEmpty) {
    return;
  }

  final List<List<RawEvent>> chunkedEvents = chunk(events,
      analytics?.state.configuration.state.maxBatchSize ?? maxEventsPerBatch,
      maxKB: maxPayloadSizeInKb);

  final List<RawEvent> sentEvents = [];
  var numFailedEvents = 0;

  // FIXED: Only dequeue successfully sent events
  await Future.forEach(chunkedEvents, (batch) async {
    try {
      final succeeded = await analytics?.httpClient.startBatchUpload(
          analytics!.state.configuration.state.writeKey, batch,
          host: _apiHost);

      if (succeeded == true) {
        // Only add to sentEvents on actual success
        sentEvents.addAll(batch);
      } else {
        numFailedEvents += batch.length;
      }
    } catch (e) {
      numFailedEvents += batch.length;
      // Don't add failed events to sentEvents
    }
    // Move dequeue outside finally, after the loop
  });

  // Only dequeue events that were actually sent successfully
  if (sentEvents.isNotEmpty) {
    _queuePlugin.dequeue(sentEvents);
  }

  if (sentEvents.isNotEmpty) {
    log("Sent ${sentEvents.length} events", kind: LogFilterKind.debug);
  }

  if (numFailedEvents > 0) {
    log("Failed to send $numFailedEvents events", kind: LogFilterKind.error);
  }

  return;
}