2 * Websocket protocol handler.
14 * URI of the websocket server.
29 * Latency function to estimate latency and keep connection alive.
32 _latencyChecker: null,
34 * Latency check start time.
49 * Message processor callback.
52 _messageCallback: function(){},
54 * Connection opened callback.
57 _connectionOpenedCallback: function(){},
59 * Connection closed callback.
62 _connectionClosedCallback: function(){},
66 * Initialize instance.
69 _initialize: function ()
71 //-- Establish server uri and connect.
72 bug.info('Websocket', '_initialize', 'Initializing websocket submodule.');
74 //_.Api.websocket._serverUri = 'ws://' + window.location.hostname + ':' + window.location.port;
75 _.Api.websocket._serverUri = 'ws://' + window.location.hostname;
76 bug.dump('Websocket', '_initialize', 'Server URI: ' + _.Api.websocket._serverUri);
77 _.Api.websocket._state = 'open';
78 _.Api.websocket.connect();
82 * Connect to websocket server.
86 //-- Create a new websocket instance.
87 _.Api.websocket._socket = new WebSocket(_.Api.websocket._serverUri);
89 //-- Handle open event.
90 _.Api.websocket._socket.onopen = function (ev)
92 _.Api.websocket._state = 'open';
93 _.Api.websocket._latencyChecker = setInterval(function ()
95 if (WebSocket.OPEN == _.Api.websocket._socket.readyState)
97 _.Api.websocket._pingStart = new Date();
98 _.Api.websocket._socket.send('{"ping":true}');
101 _.Api.websocket._connectionOpenedCallback();
102 bug.info('Websocket', '_connect', 'Connection established with ' + _.Api.websocket._serverUri + '.');
105 //-- Handle message event.
106 _.Api.websocket._socket.onmessage = function (ev)
108 var message = JSON.parse(ev.data);
109 bug.info('Websocket', 'received', message);
112 var _pingEnd = new Date();
113 _.Api.websocket._latencies.push((_pingEnd.getTime() - _.Api.websocket._pingStart.getTime()) / 2);
114 if (10 < _.Api.websocket._latencies.length)
116 _.Api.websocket._latencies.shift();
118 var sum = _.Api.websocket._latencies.reduce(function (a, b) { return a + b; });
119 _.Api.websocket._latencyAverage = sum / _.Api.websocket._latencies.length;
120 bug.info('Websocket', 'latency', _.Api.websocket._latencyAverage);
124 _.Api.websocket._messageCallback(message);
128 //-- Handle error event.
129 _.Api.websocket._socket.onerror = function (ev)
131 bug.warn('Websocket', '_connect', ev);
134 //-- Handle close event.
135 _.Api.websocket._socket.onclose = function (ev)
137 _.Api.websocket._socket = null;
138 clearInterval(_.Api.websocket._latencyChecker);
139 _.Api.websocket._connectionClosedCallback();
140 if ('closed' == _.Api.websocket._state)
144 bug.info('Websocket', '_connect.onclose', 'Connection closed.');
145 bug.dump('Websocket', '_connect.onclose', ev);
146 setTimeout(function () {
147 $.proxy(_.Api.websocket.connect, _.Api.websocket)()
156 _.Api.websocket._state = 'closed';
157 _.Api.websocket._socket.close();