|
1 | | -var m = document.getElementById('messages'); |
2 | | -var s = document.getElementById('status'); |
3 | | -var f = document.getElementById('f'); |
4 | | -var i = document.getElementById('msg'); |
| 1 | +(function() { |
| 2 | + 'use strict'; |
| 3 | + var messages = document.getElementById('messages'); |
| 4 | + var status = document.getElementById('status'); |
| 5 | + var statusText = status.querySelector('.status-text'); |
| 6 | + var form = document.getElementById('f'); |
| 7 | + var input = document.getElementById('msg'); |
5 | 8 |
|
6 | | -function fmt(t) { |
7 | | - var d = new Date(t); |
8 | | - var pad = function(n) { return n < 10 ? '0' + n : n; }; |
9 | | - return pad(d.getUTCDate()) + '.' + pad(d.getUTCMonth() + 1) + '.' + d.getUTCFullYear() + ' ' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()); |
10 | | -} |
11 | | -function esc(t) { var d = document.createElement('div'); d.textContent = t; return d.innerHTML; } |
| 9 | + function fmt(t) { |
| 10 | + var d = new Date(t); |
| 11 | + var pad = function(n) { return n < 10 ? '0' + n : n; }; |
| 12 | + return pad(d.getDate()) + '.' + pad(d.getMonth() + 1) + '.' + d.getFullYear() + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()); |
| 13 | + } |
12 | 14 |
|
13 | | -function add(msg) { |
14 | | - var d = document.createElement('div'); |
15 | | - d.className = 'message'; |
16 | | - d.innerHTML = '<div class="time">' + fmt(msg.createdAt) + '</div><div>' + esc(msg.message) + '</div>'; |
17 | | - m.insertBefore(d, m.firstChild); |
18 | | -} |
| 15 | + function esc(t) { var d = document.createElement('div'); d.textContent = t; return d.innerHTML; } |
19 | 16 |
|
20 | | -var ws; |
21 | | -function connect() { |
22 | | - ws = new WebSocket((location.protocol === 'https:' ? 'wss:' : 'ws:') + '//' + location.host + '/ws'); |
23 | | - ws.onopen = function() { s.textContent = 'Connected'; s.className = 'connected'; }; |
24 | | - ws.onmessage = function(e) { try { add(JSON.parse(e.data)); } catch(err) {} }; |
25 | | - ws.onclose = function() { s.textContent = 'Disconnected'; s.className = 'disconnected'; setTimeout(connect, 3000); }; |
26 | | -} |
27 | | -connect(); |
| 17 | + function add(msg) { |
| 18 | + var el = document.createElement('article'); |
| 19 | + el.className = 'card message'; |
| 20 | + el.innerHTML = '<time class="time">' + fmt(msg.createdAt) + '</time><p class="content">' + esc(msg.message) + '</p>'; |
| 21 | + messages.insertBefore(el, messages.firstChild); |
| 22 | + } |
28 | 23 |
|
29 | | -f.onsubmit = function(e) { |
30 | | - e.preventDefault(); |
31 | | - var msg = i.value.trim(); |
32 | | - if (!msg) return; |
33 | | - fetch('/messages', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'message=' + encodeURIComponent(msg) }); |
34 | | - i.value = ''; |
35 | | -}; |
| 24 | + var ws, delay = 1000; |
| 25 | + function connect() { |
| 26 | + ws = new WebSocket((location.protocol === 'https:' ? 'wss:' : 'ws:') + '//' + location.host + '/ws'); |
| 27 | + ws.onopen = function() { status.className = 'status connected'; statusText.textContent = 'Connected'; delay = 1000; }; |
| 28 | + ws.onmessage = function(e) { try { add(JSON.parse(e.data)); } catch(err) {} }; |
| 29 | + ws.onclose = function() { status.className = 'status disconnected'; statusText.textContent = 'Reconnecting...'; setTimeout(connect, delay); delay = Math.min(delay * 2, 30000); }; |
| 30 | + ws.onerror = function() { ws.close(); }; |
| 31 | + } |
| 32 | + connect(); |
| 33 | + |
| 34 | + form.onsubmit = function(e) { |
| 35 | + e.preventDefault(); |
| 36 | + var msg = input.value.trim(); |
| 37 | + if (!msg) return; |
| 38 | + fetch('/messages', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'message=' + encodeURIComponent(msg) }); |
| 39 | + input.value = ''; |
| 40 | + }; |
| 41 | + |
| 42 | + input.focus(); |
| 43 | +})(); |
0 commit comments