use aok::{OK, Void};
use volo::Service;
use volo_grpc::{
RecvEntryMessage, Request, Response, SendEntryMessage, Status,
codec::compression::{CompressionEncoding::Zstd, ZstdConfig},
context::ServerContext,
server::{NamedService, Server, ServiceBuilder},
};
use crate::env_addr;
pub async fn grpc<S, T, U>(api_server: S, init: impl Fn(Server) -> Server) -> Void
where
S: 'static
+ Service<ServerContext, Request<T>, Response = Response<U>>
+ Sync
+ Send
+ NamedService
+ Clone,
S::Error: Into<Status>,
T: RecvEntryMessage + 'static,
U: SendEntryMessage + 'static,
{
let addr: volo::net::Address = env_addr("GRPC", 3333).into();
let compression_config = vec![Zstd(Some(ZstdConfig::default()))];
let srv = ServiceBuilder::new(api_server)
.send_compressions(compression_config.clone())
.accept_compressions(compression_config)
.build();
xerr::log!(
init(Server::new())
.add_service(srv)
.run(addr)
.await
);
OK
}