flush method

Future<void> flush()

Implementation

Future<void> flush() async {
  clearTimeout();

  if (!failed_) {
    if (pendingCount_ > 0) {
      List<Exposure>? exposures;
      List<GoalAchievement>? achievements;
      int eventCount;

      eventCount = pendingCount_;

      if (eventCount > 0) {
        if (exposures_.isNotEmpty) {
          exposures = exposures_.toList();
          exposures_.clear();
        }

        if (achievements_.isNotEmpty) {
          achievements = achievements_.toList();
          achievements_.clear();
        }

        pendingCount_ = 0;
      }

      if (eventCount > 0) {
        List<Unit> units = [];

        for (var entry in units_.entries) {
          units.add(Unit(
              type: entry.key,
              uid: utf8.decode(getUnitHash(entry.key, entry.value))));
        }

        units_.forEach((key, value) {
          units.add(
              Unit(type: key, uid: utf8.decode(getUnitHash(key, value))));
        });

        final PublishEvent event = PublishEvent(
          hashed: true,
          units: units,
          publishedAt: clock_.millis(),
          exposures: exposures ?? [],
          goals: achievements ?? [],
          attributes: attributes_.toList(),
        );
        event.hashed = true;
        event.publishedAt = clock_.millis();

        final Completer<void> result = Completer<void>();

        eventHandler_.publish(this, event).future.then((_) {
          logEvent(EventType.publish, event);
          result.complete();
        }).catchError((error) {
          logError(error);
          result.completeError(error);
        });

        return result.future;
      }
    }
  } else {
    exposures_.clear();
    achievements_.clear();
    pendingCount_ = 0;
  }

  return Future.value();
}