window.onerror = (ev, source, line, col, err) => { let messageContents = document.createElement("span"); messageContents.innerText = `Internal error: ${err} at ${source}:${line}:${col}`; let newMsg = document.createElement("div"); newMsg.classList.add("message"); newMsg.appendChild(messageContents); document.getElementById("chat-body").appendChild(newMsg); }; function log(...args) { let messageContents = document.createElement("span"); messageContents.innerText = `Log: ${args.join("")}`; let newMsg = document.createElement("div"); newMsg.classList.add("message"); newMsg.appendChild(messageContents); document.getElementById("chat-body").appendChild(newMsg); } let wsurl = new URL(document.location.toString()); wsurl.port = 3000; if (document.location.protocol == "https") { wsurl.protocol = "wss"; } else { wsurl.protocol = "ws"; } let conn = new WebSocket(wsurl); conn.onmessage = (ev) => { let messageContents = document.createElement("span"); messageContents.innerText = ev.data; let newMsg = document.createElement("div"); newMsg.classList.add("message"); newMsg.appendChild(messageContents); document.getElementById("chat-body").appendChild(newMsg); }; /** * @type {HTMLInputElement} */ let input = document.getElementById("chat-input"); input.onchange = (_) => { conn.send(input.value.toString()); input.value = ""; } /** * @type {HTMLButtonElement} */ let submit = document.getElementById("send"); submit.onclick = (_) => { conn.send(input.value.toString()); input.value = ""; } log("waiting for open") conn.onopen = () => { log("opened") conn.send("join"); }