-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.js
More file actions
148 lines (131 loc) · 4.04 KB
/
client.js
File metadata and controls
148 lines (131 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
"use strict";
// define ip address and port
const ip = "127.0.0.1";
const port = "1337";
// for better performance - to avoid searching in DOM
const inputEl = document.querySelector("#input");
const contentEl = document.querySelector("#content");
const statusEl = document.querySelector("#status");
// user color assigned by the server
let userColor = null;
// user name sent to the server
let userName = null;
// if user is running mozilla then use it's built-in WebSocket
window.WebSocket = window.WebSocket || window.MozWebSocket;
// if browser doesn't support WebSocket, just show
// some notification and exit
if (!window.WebSocket) {
contentEl.innerHTML = "<p>Sorry, your browser doesn't support websocket.</p>";
inputEl.style = "display: none";
statusEl.style = "display: none";
}
// open connection
const connection = new WebSocket(`ws://${ip}:${port}`);
connection.addEventListener("open", e => {
// first we want users to enter their names
inputEl.removeAttribute("disabled");
statusEl.innerHTML = "Choose name:";
});
connection.addEventListener("error", err => {
// just in there were some problems with connection...
contentEl.innerHTML =
"<p>Sorry, but there's some problem with your connection, or the server is down.</p>";
});
// most important part - incoming messages
connection.addEventListener("message", msg => {
// try to parse JSON message. Because we know that the server
// always returns JSON this should work without any problem but
// we should make sure that the massage is not chunked or
// otherwise damaged.
var json;
try {
json = JSON.parse(msg.data);
} catch (e) {
console.log("Invalid JSON: ", msg.data);
return;
}
// NOTE: if you're not sure about the JSON structure
// check the server source code above
// first response from the server with user's color
if (json.type === "color") {
userColor = json.data;
statusEl.innerHTML = userName + ": ";
statusEl.style.color = userColor;
inputEl.removeAttribute("disabled");
inputEl.focus();
// from now user can start sending messages
} else if (json.type === "history") {
// insert every single message to the chat window
for (var i = 0; i < json.data.length; i++) {
addMessage(
json.data[i].author,
json.data[i].text,
json.data[i].color,
new Date(json.data[i].time)
);
}
} else if (json.type === "message") {
// let the user write another message
inputEl.removeAttribute("disabled");
inputEl.focus();
addMessage(
json.data.author,
json.data.text,
json.data.color,
new Date(json.data.time)
);
} else {
console.log("Hmm..., I've never seen JSON like this:", json);
}
});
/**
* Send message when user presses Enter key
*/
input.addEventListener("keydown", e => {
if (e.keyCode === 13) {
const msg = inputEl.value;
if (!msg) {
return;
}
// send the message as an ordinary text
connection.send(msg);
inputEl.value = "";
// disable the input field to make the user wait until server
// sends back response
inputEl.setAttribute("disabled", "disabled");
// we know that the first message sent from a user their name
if (!userName) {
userName = msg;
}
}
});
/**
* This method is optional. If the server wasn't able to
* respond to the in 3 seconds then show some error message
* to notify the user that something is wrong.
*/
setInterval(() => {
if (connection.readyState !== 1) {
statusEl.innerHTML = "ERROR";
inputEl.setAttribute("disabled", "disabled");
inputEl.value = "Unable to communicate with the WebSocket server.";
}
}, 3000);
/**
* Add message to the chat window
*/
function addMessage(author, message, color, dt) {
contentEl.innerHTML +=
'<p><span style="color:' +
color +
'">' +
author +
"</span> @ " +
(dt.getHours() < 10 ? "0" + dt.getHours() : dt.getHours()) +
":" +
(dt.getMinutes() < 10 ? "0" + dt.getMinutes() : dt.getMinutes()) +
": " +
message +
"</p>";
contentEl.scrollTop = contentEl.clientHeight;
}