submit method

Future<void> submit(
  1. MissionMessage mission
)

Submit a mission.

Implementation

Future<void> submit(MissionMessage mission) {
  final preCancelled = _pendingCancels.remove(mission.missionId);
  if (preCancelled) {
    _pendingCancelOrder.remove(mission.missionId);
    // Cancelled before it was ever dispatched: it must NOT preempt the
    // running mission, and it never queues behind it — the runner sees a
    // pre-cancelled token and answers with its single `cancelled` frame
    // (Android MissionRunner prologue step 1).
    final token = MissionCancelToken()..cancel();
    return Future<void>.sync(() => runMission(mission, token))
        .catchError((Object _) {});
  }

  _newestToken?.cancel();

  final token = MissionCancelToken();
  _newestToken = token;
  _submitted[mission.missionId] = token;

  final run = _tail.then((_) async {
    _activeMissionId = mission.missionId;
    _activeToken = token;
    try {
      await runMission(mission, token);
    } catch (_) {
    } finally {
      if (identical(_activeToken, token)) {
        _activeToken = null;
        _activeMissionId = null;
      }
      if (identical(_newestToken, token)) {
        _newestToken = null;
      }
      if (identical(_submitted[mission.missionId], token)) {
        _submitted.remove(mission.missionId);
      }
    }
  });
  _tail = run;
  return run;
}