use actix_web::{rt, web, Error, HttpRequest, HttpResponse, Responder};
use tokio::sync::broadcast;
use crate::core::{request2::Render, R};
pub async fn basic_ws(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
let (res, session, msg_stream) = actix_ws::handle(&req, stream)?;
rt::spawn(super::echo_basic_ws(session, msg_stream));
Ok(res)
}
pub async fn heartbeat_ws(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
let (res, session, msg_stream) = actix_ws::handle(&req, stream)?;
rt::spawn(super::echo_heartbeat_ws(session, msg_stream));
Ok(res)
}
pub async fn broadcast_ws(
req: HttpRequest,
stream: web::Payload,
tx: web::Data<broadcast::Sender<web::Bytes>>,
) -> Result<HttpResponse, Error> {
let (res, session, msg_stream) = actix_ws::handle(&req, stream)?;
rt::spawn(super::echo_broadcast_ws(
session,
msg_stream,
tx.subscribe(),
));
Ok(res)
}
pub async fn send_to_broadcast_ws(
request: HttpRequest,
body: web::Bytes,
tx: web::Data<broadcast::Sender<web::Bytes>>,
) -> Result<impl Responder, Error> {
tx.send(body).map_err(|e| {
log::error!("send_to_broadcast_ws: error={:?}", e);
actix_web::error::ErrorInternalServerError(e)
})?;
Ok(request.json(200, R::ok(true)))
}