Serviço Rust para receber mídias (áudio, imagem e vídeo) por streaming gRPC, processar o conteúdo em chunks sob consumo de memória constante
- 📝 Arquitetura do Projeto: Detalhamento de camadas, fluxos gRPC e responsabilidades.
- 📖 Wiki de Utilitários de Streaming (shared/utils): Explicações da arquitetura reativa, ciclo de vida ETL (
extract_it,validate_it,transform_it,load_it) e exemplos de criação de operadores.
O fluxo implementado é:
- O cliente abre um upload bidirecional em streaming pelo método
MediaService.UploadVideo. - O adaptador gRPC transforma cada
UploadChunkRequestem um fluxo assíncrono de bytes. - Um identificador UUID é criado para a mídia e o caso de uso de upload é executado de forma assíncrona.
- A pipeline reativa lê o conteúdo em chunks de 16 KiB e executa as etapas configuradas.
- O extrator (
extract_media_metadata) acumula os bytes e tenta identificar contêineres de mídia (áudio, imagem ou vídeo) a partir do cabeçalho inicial dos dados, populando oPipelineContext. - O validador (
validate_video_metadata) lê o contexto e executa as regras de validação associadas. - Eventos de progresso, conclusão ou falha são publicados em um barramento interno e expostos ao cliente como
ProgressResponse.
A persistência definitiva no vault físico ainda não está implementada. O resultado atual retorna um caminho fictício no formato
/vault/storage/{media_id}.
.
├── proto/
│ └── media.proto # Contrato gRPC
├── src/
│ ├── main.rs # Inicialização do servidor
│ ├── lib.rs # Módulos públicos da crate
│ ├── build.rs # Geração do código protobuf
│ ├── core/ # Domínio e regras de negócio
│ │ ├── domain/
│ │ ├── ports/
│ │ ├── services/ # Serviços baseados nos helpers do FnOperator
│ │ └── use_cases/
│ ├── infra/ # Adaptadores de Entrada/Saída, runtime e config
│ │ └── adapters/
│ └── shared/ # Componentes técnicos utilitários
│ └── utils/
│ ├── event_bus.rs
│ ├── grpc.rs
│ ├── streaming/ # Engine de pipeline, PipelineContext e erros
│ └── operators/ # FnOperator e helpers ETL (extract_it, validate_it, etc.)
└── doc/
├── arquitetura.md # Detalhamento de arquitetura
└── shared_utils_wiki.md # Guia do desenvolvedor para a pipeline reativa
- Rust 2024
- Tokio para runtime assíncrono
- Tonic, Prost e Protocol Buffers para gRPC
- Serde para serialização dos tipos de domínio
tokio::sync::broadcastpara eventos internos de progressoinferpara detecção de MIME types a partir do fluxo de bytes
Pré-requisitos:
- Rust e Cargo instalados
Para compilar:
cargo checkPara rodar a suite de testes unitários:
cargo testPara iniciar o servidor gRPC local:
cargo runO servidor escuta, por padrão, em [::1]:50051.