sockjs 0.3.0

SockJS server for Actix
Documentation
use bytes::Bytes;
use session::SessionError;

#[derive(Debug, Message)]
pub enum Frame {
    Open,
    Close(CloseCode),
    Message(String),
    MessageBlob(Bytes),
    MessageVec(String),
    Heartbeat,
}

impl Frame {
    pub fn is_msg(&self) -> bool {
        match *self {
            Frame::Message(_) => true,
            _ => false,
        }
    }
    pub fn into_message(self) -> String {
        match self {
            Frame::Message(msg) => msg,
            _ => panic!(),
        }
    }
}

impl From<String> for Frame {
    fn from(s: String) -> Frame {
        Frame::Message(s)
    }
}

impl From<Bytes> for Frame {
    fn from(s: Bytes) -> Frame {
        Frame::MessageBlob(s)
    }
}

#[derive(Copy, Clone, Debug)]
pub enum CloseCode {
    Interrupted,
    GoAway,
    Acquired,
    InternalError,
}

impl CloseCode {
    pub fn num(&self) -> usize {
        match *self {
            CloseCode::Interrupted => 1002,
            CloseCode::Acquired => 2010,
            CloseCode::GoAway | CloseCode::InternalError => 3000,
        }
    }

    pub fn reason(&self) -> &'static str {
        match *self {
            CloseCode::Interrupted => "Connection interrupted",
            CloseCode::GoAway => "Go away!",
            CloseCode::Acquired => "Another connection still open",
            CloseCode::InternalError => "Internal error",
        }
    }
}

impl From<SessionError> for Frame {
    fn from(err: SessionError) -> Frame {
        match err {
            SessionError::Acquired => Frame::Close(CloseCode::Acquired),
            SessionError::Interrupted => Frame::Close(CloseCode::Interrupted),
            SessionError::Closing => Frame::Close(CloseCode::GoAway),
            SessionError::InternalError => Frame::Close(CloseCode::InternalError),
        }
    }
}

impl From<SessionError> for CloseCode {
    fn from(err: SessionError) -> CloseCode {
        match err {
            SessionError::Acquired => CloseCode::Acquired,
            SessionError::Interrupted => CloseCode::Interrupted,
            SessionError::Closing => CloseCode::GoAway,
            SessionError::InternalError => CloseCode::InternalError,
        }
    }
}

pub const IFRAME_HTML: &str = r#"<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
  <script>
    document.domain = document.domain;
    SockJS.bootstrap_iframe();
  </script>
</head>
<body>
  <h2>Don't panic!</h2>
  <p>This is a SockJS hidden iframe. It's used for cross domain magic.</p>
</body>
</html>"#;