frame_stream

Crates.ioframe_stream
lib.rsframe_stream
version0.1.2
created_at2025-06-24 08:36:58.944766+00
updated_at2025-06-24 09:32:35.062735+00
descriptionframe_stream
homepagehttps://github.com/i18n-site/rust/tree/dev/frame_stream
repositoryhttps://github.com/i18n-site/rust.git
max_upload_size
id1724024
size23,813
i18n.site (i18nsite)

documentation

README

frame_stream

#![feature(doc_auto_cfg)]
#![feature(doc_cfg)]

use std::convert::Infallible;

use bytes::{BufMut, Bytes, BytesMut};
use futures_lite::stream::{Stream, unfold};
use kanal::AsyncReceiver;

pub fn frame_stream<B: AsRef<[u8]>>(
  receiver: AsyncReceiver<B>,
) -> impl Stream<Item = Result<Bytes, Infallible>> {
  unfold(receiver, |rx| async move {
    match rx.recv().await {
      Ok(chunk) => {
        let chunk = chunk.as_ref();
        let len = chunk.len();
        let mut framed_chunk = BytesMut::with_capacity(4 + len);
        framed_chunk.put_u32_le(len as u32); // 4 字节长度前缀
        framed_chunk.put_slice(&chunk);

        let item = Ok(framed_chunk.freeze());
        let next_state = rx;
        Some((item, next_state))
      }
      Err(_) => None,
    }
  })
}

#[cfg(feature = "axum")]
pub fn response<B: AsRef<[u8]> + Send + 'static>(
  receiver: AsyncReceiver<B>,
) -> axum::response::Response {
  use axum::{body::Body, http::header::CONTENT_TYPE};

  axum::response::Response::builder()
    .header(CONTENT_TYPE, "application/octet-stream")
    .body(Body::from_stream(frame_stream(receiver)))
    .unwrap()
}

About

This project is an open-source component of i18n.site ⋅ Internationalization Solution.

关于

本项目为 i18n.site ⋅ 国际化解决方案 的开源组件。

Commit count: 68

cargo fmt