middleware.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. use flowy_net::{request::ResponseMiddleware, response::FlowyResponse};
  2. use lazy_static::lazy_static;
  3. use std::sync::Arc;
  4. use tokio::sync::broadcast;
  5. lazy_static! {
  6. pub static ref BACKEND_API_MIDDLEWARE: Arc<WorkspaceMiddleware> = Arc::new(WorkspaceMiddleware::new());
  7. }
  8. pub struct WorkspaceMiddleware {
  9. invalid_token_sender: broadcast::Sender<String>,
  10. }
  11. impl WorkspaceMiddleware {
  12. fn new() -> Self {
  13. let (sender, _) = broadcast::channel(10);
  14. WorkspaceMiddleware {
  15. invalid_token_sender: sender,
  16. }
  17. }
  18. pub fn invalid_token_subscribe(&self) -> broadcast::Receiver<String> { self.invalid_token_sender.subscribe() }
  19. }
  20. impl ResponseMiddleware for WorkspaceMiddleware {
  21. fn receive_response(&self, token: &Option<String>, response: &FlowyResponse) {
  22. if let Some(error) = &response.error {
  23. if error.is_unauthorized() {
  24. log::error!("user is unauthorized");
  25. match token {
  26. None => {},
  27. Some(token) => match self.invalid_token_sender.send(token.clone()) {
  28. Ok(_) => {},
  29. Err(e) => log::error!("{:?}", e),
  30. },
  31. }
  32. }
  33. }
  34. }
  35. }