The current implementation is quite cumbursome and too tied to the synchronization engine to be able to leverage it for the Direct Transfer.
The idea is too move out all stuff related to uploads into its own uploader object that could be easily subclassed later for different needs.
Without such move, we will end having a lot of duplicated code: one upload flow for the synchronization and one upload flow for Direct Transfer. And later, another update flow for the feature XXX. This is not scalable; and upload resilience is so important we should not have it spread in too many files.