websocket.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. use std::collections::HashMap;
  2. use std::sync::{Arc, RwLock};
  3. use actors::ws::WebsocketActor;
  4. use actors::{Actor, ActorHandle};
  5. use warp::Filter;
  6. type Arbiter = Arc<RwLock<HashMap<usize, ActorHandle<WebsocketActor>>>>;
  7. #[tokio::main]
  8. async fn main() {
  9. let arbiter = Arc::new(RwLock::new(HashMap::new()));
  10. let arbiter = warp::any().map(move || arbiter.clone());
  11. // GET /chat -> websocket upgrade
  12. let chat = warp::path("chat")
  13. // The `ws()` filter will prepare Websocket handshake...
  14. .and(warp::ws())
  15. .and(arbiter)
  16. .map(|ws: warp::ws::Ws, arbiter: Arbiter| {
  17. // This will call our function if the handshake succeeds.
  18. ws.on_upgrade(move |socket| {
  19. let actor = WebsocketActor::new(socket);
  20. let handle = actor.start();
  21. arbiter.write().unwrap().insert(0, handle);
  22. futures::future::ready(())
  23. })
  24. });
  25. // GET / -> index html
  26. let index = warp::path::end().map(|| warp::reply::html(INDEX_HTML));
  27. let routes = index.or(chat);
  28. warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
  29. }
  30. static INDEX_HTML: &str = r#"<!DOCTYPE html>
  31. <html lang="en">
  32. <head>
  33. <title>Warp Chat</title>
  34. </head>
  35. <body>
  36. <h1>Warp chat</h1>
  37. <div id="chat">
  38. <p><em>Connecting...</em></p>
  39. </div>
  40. <input type="text" id="text" />
  41. <button type="button" id="send">Send</button>
  42. <script type="text/javascript">
  43. const chat = document.getElementById('chat');
  44. const text = document.getElementById('text');
  45. const uri = 'ws://' + location.host + '/chat';
  46. const ws = new WebSocket(uri);
  47. function message(data) {
  48. }
  49. ws.onopen = function() {
  50. chat.innerHTML = '<p><em>Connected!</em></p>';
  51. };
  52. ws.onmessage = function(msg) {
  53. message(msg.data);
  54. };
  55. ws.onclose = function() {
  56. chat.getElementsByTagName('em')[0].innerText = 'Disconnected!';
  57. };
  58. send.onclick = function() {
  59. const msg = text.value;
  60. let i = 0;
  61. while (i < 10000) {
  62. ws.send(msg);
  63. i += 1;
  64. }
  65. text.value = '';
  66. message('<You>: ' + msg);
  67. };
  68. </script>
  69. </body>
  70. </html>
  71. "#;