core: Load all `NetStream` data in chunks.

This commit is contained in:
David Wendt 2024-01-06 22:02:06 -05:00 committed by kmeisthax
parent 91dd9563bb
commit 08ee3ea638
1 changed files with 49 additions and 19 deletions

View File

@ -1621,8 +1621,8 @@ impl<'gc> Loader<'gc> {
Box::pin(async move { Box::pin(async move {
let fetch = player.lock().unwrap().navigator().fetch(request); let fetch = player.lock().unwrap().navigator().fetch(request);
let response = Self::wait_for_full_response(fetch).await; match fetch.await {
Ok(mut response) => {
player.lock().unwrap().update(|uc| { player.lock().unwrap().update(|uc| {
let loader = uc.load_manager.get_loader(handle); let loader = uc.load_manager.get_loader(handle);
let stream = match loader { let stream = match loader {
@ -1631,18 +1631,48 @@ impl<'gc> Loader<'gc> {
_ => return Err(Error::NotNetStreamLoader), _ => return Err(Error::NotNetStreamLoader),
}; };
match response {
Ok((mut body, _, _, _)) => {
stream.reset_buffer(uc); stream.reset_buffer(uc);
stream.load_buffer(uc, &mut body); Ok(())
})?;
loop {
let chunk = response.next_chunk().await;
let is_end = matches!(chunk, Ok(None));
player.lock().unwrap().update(|uc| {
let loader = uc.load_manager.get_loader(handle);
let stream = match loader {
Some(&Loader::NetStream { target_stream, .. }) => target_stream,
None => return Err(Error::Cancelled),
_ => return Err(Error::NotNetStreamLoader),
};
match chunk {
Ok(Some(mut data)) => stream.load_buffer(uc, &mut data),
Ok(None) => {}
Err(err) => stream.report_error(err),
} }
Err(response) => { Ok(())
stream.report_error(response.error); })?;
if is_end {
break;
} }
} }
Ok(()) Ok(())
}) }
Err(response) => player.lock().unwrap().update(|uc| {
let loader = uc.load_manager.get_loader(handle);
let stream = match loader {
Some(&Loader::NetStream { target_stream, .. }) => target_stream,
None => return Err(Error::Cancelled),
_ => return Err(Error::NotNetStreamLoader),
};
stream.report_error(response.error);
Ok(())
}),
}
}) })
} }