···6868 match result.wrap_err("Error streaming logs for project") {
6969 Err(err) => error!("{}", eyre_fmt!(err)),
7070 Ok(bytes) => {
7171+ let bytes = normalise_line_endings(&bytes);
7272+7373+ // Update buffer with logs and send to subscribers
7174 buffer.write().await.extend_from_slice(&bytes);
7275 if channel.send(bytes).is_err() {
7376 // There are no subscribers, so clean up and stop the worker
···102105 return entry;
103106 }
104107}
108108+109109+/// Normalises line endings in the given bytes to be CRLF.
110110+fn normalise_line_endings(bytes: &[u8]) -> Bytes {
111111+ let mut out = BytesMut::with_capacity(bytes.len());
112112+113113+ let mut prev = 0u8;
114114+ for &b in bytes.iter() {
115115+ if b == b'\n' && prev != b'\r' {
116116+ out.extend_from_slice(b"\r\n");
117117+ } else {
118118+ out.extend_from_slice(&[b]);
119119+ }
120120+ prev = b;
121121+ }
122122+123123+ return out.freeze();
124124+}