diff --git a/pkg/web/message.go b/pkg/web/message.go
index 4c28273..36f9c26 100644
--- a/pkg/web/message.go
+++ b/pkg/web/message.go
@@ -1,12 +1,15 @@
package web
+import "fmt"
+
type MessageType int
const (
MessageBinary MessageType = 2
- MessagePing MessageType = 100
- MessageCall MessageType = 101
- MessageAnswer MessageType = 102
+ MessagePing MessageType = 101
+ MessagePong MessageType = 102
+ MessageCall MessageType = 103
+ MessageAnswer MessageType = 104
MessageConnect MessageType = 110
MessageJoin MessageType = 111
MessageQuit MessageType = 112
@@ -24,6 +27,8 @@ func (t MessageType) String() string {
return "Binary"
case MessagePing:
return "Ping"
+ case MessagePong:
+ return "Pong"
case MessageCall:
return "Call"
case MessageAnswer:
@@ -45,6 +50,6 @@ func (t MessageType) String() string {
case MessageChat:
return "Chat"
default:
- return "Unknown"
+ return fmt.Sprintf("%d?", t)
}
}
diff --git a/pkg/web/public/assets/js/harmony.js b/pkg/web/public/assets/js/harmony.js
index 34a1efa..2e51a08 100644
--- a/pkg/web/public/assets/js/harmony.js
+++ b/pkg/web/public/assets/js/harmony.js
@@ -31,12 +31,16 @@ var audioTrack;
var shownPTTHelp = false;
var muteOnMouseUp = true;
+var lastPing = 0;
+var userPing = 0;
+
var userListStatus = 'Loading...';
var MessageBinary = 2;
-var MessagePing = 100;
-var MessageCall = 101;
-var MessageAnswer = 102;
+var MessagePing = 101;
+var MessagePong = 102;
+var MessageCall = 103;
+var MessageAnswer = 104;
var MessageConnect = 110;
var MessageJoin = 111;
var MessageQuit = 112;
@@ -163,7 +167,7 @@ $(document).ready(function () {
return;
}
- w(MessagePing, "ping");
+ pingServer();
}, 15000);
if (printStats) {
@@ -336,9 +340,12 @@ function Connect() {
clearTimeout(reconnectTimeout);
}
+ userListStatus = "";
+ updateUserStatus();
+
w(MessageNick, nickname);
- updateUserStatus();
+ pingServer();
};
socket.onmessage = function (e) {
if (ReconnectDelay > 0) {
@@ -352,7 +359,13 @@ function Connect() {
p.M = atob(p.M);
}
- if (p.T == MessageAnswer) {
+ if (p.T == MessagePong) {
+ if (parseInt(p.M, 10) == lastPing) {
+ userPing = Date.now() - lastPing;
+
+ updateUserStatus();
+ }
+ } else if (p.T == MessageAnswer) {
if (p.PC === undefined || p.PC > peerConnections.length) {
return;
}
@@ -376,7 +389,7 @@ function Connect() {
return;
}
- Log( escapeEntities(p.N) + " quit #lobby voice chat");
+ Log(escapeEntities(p.N) + " quit #lobby voice chat");
} else if (p.T == MessageDisconnect) {
if (p.N === undefined) {
return;
@@ -390,21 +403,10 @@ function Connect() {
Log("<" + escapeEntities(p.N) + "> " + escapeEntities(p.M));
} else if (p.T == MessageUsers) {
- var usersconnected = 0;
- var usersvoice = 0;
-
var u = JSON.parse(p.M);
for (let i = 0; i < u.length; i++) {
- usersconnected++;
-
- if (u[i].V) {
- usersvoice++;
- }
+ // TODO: Parse
}
-
- userListStatus = "Users: " + usersconnected + " - Voice chatting: " + usersvoice;
-
- updateUserStatus();
}
} else {
// TODO Binary data
@@ -432,6 +434,11 @@ function Connect() {
};
}
+function pingServer() {
+ lastPing = Date.now();
+ w(MessagePing, lastPing);
+}
+
function webSocketReady() {
return (socket !== null && socket.readyState === 1);
}
@@ -464,6 +471,8 @@ function StartPTT() {
ptt = true;
+ $("#voiceptt").html('Transmitting...');
+
var sender = peerConnections[0].getSenders()[0];
sender.replaceTrack(audioTrack);
@@ -477,6 +486,8 @@ function StopPTT() {
ptt = false;
+ $("#voiceptt").html('Push-To-Talk');
+
var sender = peerConnections[0].getSenders()[0];
sender.replaceTrack(null);
@@ -484,11 +495,20 @@ function StopPTT() {
}
function updateUserStatus() {
- if (ptt) {
- $('#userstatus').html('Transmitting');
- } else {
- $('#userstatus').html(userListStatus);
+ var out = '';
+ if (userPing > 0) {
+ out += userPing + 'ms ping';
}
+
+ if (userListStatus != '') {
+ if (out != '') {
+ out += '
';
+ }
+
+ out += userListStatus;
+ }
+
+ $('#userstatus').html(out);
}
function w(t, m) {
diff --git a/pkg/web/web.go b/pkg/web/web.go
index 41052c8..4856293 100644
--- a/pkg/web/web.go
+++ b/pkg/web/web.go
@@ -122,7 +122,7 @@ func (w *WebInterface) handleRead(c *Client) {
// TODO Binary message
continue
case MessagePing:
- // TODO Handle ping
+ c.Out <- &Message{T: MessagePong, M: msg.M}
case MessageCall:
answer, err := w.answerRTC(c, msg.PC, msg.M)
if err != nil {