···276276 let limit = 1000;
277277 let db = fjall.clone();
278278279279- let ops = spawn_blocking(move || {
279279+ let (tx, rx) = tokio::sync::mpsc::channel::<anyhow::Result<_>>(64);
280280+281281+ tokio::task::spawn_blocking(move || {
280282 let iter = db.export_ops((after + 1)..)?;
281281- iter.take(limit).collect::<anyhow::Result<Vec<_>>>()
282282- })
283283- .await?;
283283+ for op in iter.take(limit) {
284284+ if tx.blocking_send(op).is_err() {
285285+ break;
286286+ }
287287+ }
288288+ anyhow::Ok(())
289289+ });
284290285285- let stream = futures::stream::iter(ops).map(|op| {
291291+ // todo: its a bit annoying that errors just cut it off here...
292292+ let stream = tokio_stream::wrappers::ReceiverStream::new(rx).map(|result| {
293293+ let op = result.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
286294 let mut json = serde_json::to_string(&op.to_sequenced_json()).unwrap();
287295 json.push('\n');
288296 Ok::<_, std::io::Error>(json)