-
Notifications
You must be signed in to change notification settings - Fork 0
/
service.js
116 lines (90 loc) · 3.13 KB
/
service.js
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
/**
*
*/
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, url = require('url')
var msg = require('./msg.js');
var state = require('./player_state.js');
var action = require('./player_action.js');
var last_player_time; //in seconds
var last_server_time;
var latency = {};
var current_state;
var SEEK_THRESHOLD = 1;
app.listen(8080);
last_player_time = 0;
last_server_time = Date.now();
function handler (req, res) {
// parse URL
var requestURL = url.parse(req.url, true);
var msgType = requestURL.query.msgType;
console.error('received message ' + JSON.stringify(requestURL.query));
data = requestURL.query;
// if the message is to request
if (msgType == msg.MsgType.REQUEST) {
var message = {
msgType: msg.MsgType.ACTION,
clientId: data.clientId,
playerTime: data.playerTime
};
var server_expected_time = last_player_time;
if (current_state == state.PlayerState.PLAYING) {
//console.error((Date.now()-last_server_time) / 1000);
server_expected_time = (Date.now()-last_server_time) / 1000 + last_player_time;
}
last_player_time = parseInt(data.playerTime);
last_server_time = Date.now();
console.error("server_expected_time: "+server_expected_time);
console.error("last_player_time: "+last_player_time);
console.error("last_server_time: "+last_server_time);
if (Math.abs(data.playerTime-server_expected_time) > SEEK_THRESHOLD) {
//consider as seek.
message.playerAction = action.PlayerAction.SEEK;
}
else
{
var player_state = parseInt(data.playerState);
switch (player_state) {
case state.PlayerState.PLAYING:
message.playerAction = action.PlayerAction.PLAY;
current_state = state.PlayerState.PLAYING;
break;
case state.PlayerState.PAUSED:
message.playerAction= action.PlayerAction.PAUSE;
current_state = state.PlayerState.PAUSED;
break;
default:
break;
}
}
sendMessage(message);
}
// ack latency check
else if (msgType == msg.MsgType.ACK) {
latency[data.clientId] = (Date.now()-data.timestamp)/2;
}
// end the response
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("");
}
function sendMessage(message) {
var msg_id = Math.floor(Math.random() * 10000);
message.msgID = msg_id;
var msg_str = JSON.stringify(message);
if (message.playerAction == action.PlayerAction.SEEK) {
console.error("=====================");
}
console.error('sending message ' + msg_str);
io.sockets.emit('notification', {'message': msg_str});
}
io.on('connection', function(socket){
console.log('a user connected');
});
setInterval(function checkLatency() {
var message = {
msgType: msg.MsgType.CHECK_LATENCY,
timestamp: Date.now()
};
// sendMessage(message);
}, 300000);