middleware.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use crate::{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> {
  19. self.invalid_token_sender.subscribe()
  20. }
  21. }
  22. impl ResponseMiddleware for WorkspaceMiddleware {
  23. fn receive_response(&self, token: &Option<String>, response: &FlowyResponse) {
  24. if let Some(error) = &response.error {
  25. if error.is_unauthorized() {
  26. log::error!("user is unauthorized");
  27. match token {
  28. None => {}
  29. Some(token) => match self.invalid_token_sender.send(token.clone()) {
  30. Ok(_) => {}
  31. Err(e) => log::error!("{:?}", e),
  32. },
  33. }
  34. }
  35. }
  36. }
  37. }