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