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