index.html 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Websocket test</title>
  6. </head>
  7. <body>
  8. <header>
  9. <h1>Websocket test</h1>
  10. <div id="status"></div>
  11. </header>
  12. <nav>
  13. <div id="connecting">
  14. <input type="text" id="server" value=""></input>
  15. <button type="button" onclick="toggle_connection()">connection</button>
  16. </div>
  17. <div id="connected">
  18. <input type="text" id="message" value=""></input>
  19. <button type="button" onclick="sendTxt()">send</button>
  20. </div>
  21. </nav>
  22. <main id="content">
  23. <button id="clear" onclick="clearScreen()" >Clear text</button>
  24. <div id="output"></div>
  25. </main>
  26. <script>
  27. async function generateCookie(){
  28. const idLength = 15; // 15 bytes = 120 bits
  29. const randomBytes = new Uint8Array(idLength);
  30. window.crypto.getRandomValues(randomBytes); // crypto strong random bytes
  31. const hashBuffer = await window.crypto.subtle.digest("SHA-256", randomBytes.buffer); // sha-256 hash
  32. const idBytes = new Uint8Array(hashBuffer.slice(0, 15)); // take first 15 bytes of hash
  33. const base64 = btoa(String.fromCharCode.apply(null, idBytes)) // base64 encode (url safe)
  34. .replace(/\+/g, '-')
  35. .replace(/\//g, '_')
  36. .replace(/=+$/, '');
  37. return base64;
  38. }
  39. var cookie_user_id = localStorage.getItem('user_id');
  40. if(!(cookie_user_id)){
  41. generateCookie().then(value => { localStorage.setItem('user_id', value); cookie_user_id = value; });
  42. }
  43. var websocket;
  44. var server = document.getElementById('server');
  45. var message = document.getElementById('message');
  46. var connecting = document.getElementById('connecting');
  47. var connected = document.getElementById('connected');
  48. var content = document.getElementById('content');
  49. var output = document.getElementById('output');
  50. server.value = 'ws://' + window.location.host + '/ws';
  51. connected.style.display = 'none';
  52. content.style.display = 'none';
  53. function connect(){
  54. //wsHost = server.value;
  55. wsHost = server.value + '?client_id=' + cookie_user_id;
  56. console.log('cookie_user_id = ', cookie_user_id);
  57. console.log('wsHost = ', wsHost);
  58. websocket = new WebSocket(wsHost);
  59. showScreen('<b>Connecting to: ' + wsHost + '</b>');
  60. websocket.onopen = function(evt){ onOpen(evt) };
  61. websocket.onclose = function(evt){ onClose(evt) };
  62. websocket.onmessage = function(evt){ onMessage(evt) };
  63. websocket.onerror = function(evt){ onError(evt) };
  64. }
  65. function disconnect(){
  66. websocket.close();
  67. }
  68. function toggle_connection(){
  69. if(websocket && websocket.readyState == websocket.OPEN){
  70. disconnect();
  71. }else{
  72. connect();
  73. }
  74. }
  75. function sendTxt(){
  76. if(websocket.readyState == websocket.OPEN){
  77. var msg = message.value;
  78. websocket.send(msg);
  79. showScreen('sending: ' + msg);
  80. }else{
  81. showScreen('websocket is not connected');
  82. }
  83. }
  84. function onOpen(evt){
  85. showScreen('<span style="color:green">CONNECTED </span>');
  86. connecting.style.display = 'none';
  87. connected.style.display = '';
  88. content.style.display = '';
  89. }
  90. function onClose(evt){
  91. showScreen('<span style="color:red">DISCONNECTED</span>');
  92. }
  93. function onMessage(evt){
  94. showScreen('<span style="color:blue">RESPONSE: ' + evt.data + '</span>');
  95. }
  96. function onError(evt){
  97. showScreen('<span style="color:red">ERROR: ' + evt.data + '</span>');
  98. }
  99. function showScreen(html){
  100. var el = document.createElement('p');
  101. el.innerHTML = html;
  102. output.insertBefore(el, output.firstChild);
  103. }
  104. function clearScreen(){
  105. output.innerHTML = '';
  106. }
  107. </script>
  108. </body>
  109. </html>