It turned out, however, that the simple flow control he implemented was not adaptive enough to simultaneously accommodate both low-latency/low bandwidth and high-latency/high-bandwidth connection.
For resumeable uploads to work efficiently for both cases, we implemented TCP/IP-style congestion control (e.g. slow start window size scaling and exponential back-off retry timeout), but over http POST requests instead of UDP packet sends.
We were inspired by https://github.com/dmitry-dedukhin/lightweight-uploader, particularly the js implementation from Dmitry.
It turned out, however, that the simple flow control he implemented was not adaptive enough to simultaneously accommodate both low-latency/low bandwidth and high-latency/high-bandwidth connection.
For resumeable uploads to work efficiently for both cases, we implemented TCP/IP-style congestion control (e.g. slow start window size scaling and exponential back-off retry timeout), but over http POST requests instead of UDP packet sends.