static async Task ReadStreamToEnd(StreamReader stream, IObserver<string> observable) {
try {
var readBuffer = new char[1];
var lineBuffer = new StringBuilder();
while (await stream.ReadAsync(readBuffer, 0, 1).ConfigureAwait(false) > 0) {
var c = readBuffer[0];
lineBuffer.Append(c);
// This does not account for unterminated lines.... like 'verifying download...'
// We would be able to do this by sending the data also byte by byte to the receivers, but for little gain.
if ((c != '\r') && (c != '\n'))
continue;
observable.OnNext(lineBuffer.ToString());
lineBuffer.Clear();
}
if (lineBuffer.Length > 0)
observable.OnNext(lineBuffer.ToString());
observable.OnCompleted();
} catch (Exception ex) {
observable.OnError(ex);
throw;
}
}
}