comparison sat_templates/templates/default/static/websocket.js @ 164:e9f0a4215e46

multi-sites handling (moved templates to "templates" sub-directory) + noscript styles handling.
author Goffi <goffi@goffi.org>
date Mon, 10 Sep 2018 08:53:33 +0200
parents sat_templates/default/static/websocket.js@33c7ce833d3f
children
comparison
equal deleted inserted replaced
163:33f67228686a 164:e9f0a4215e46
1 /*
2 SàT templates: suit of templates for Salut à Toi
3 Copyright (C) 2017 Jérôme Poisson (goffi@goffi.org)
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Affero General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 /* websocket handler */
20
21
22 //TODO: retry websocket instead of reload
23 function WSHandler(url, token, debug=false) {
24 var socket = new WebSocket(url, 'libervia_page_' + token );
25 var retried = 0;
26
27 var errorHandler = function(error) {
28 if (retried > 20) {
29 console.error("Too many tries, can't start websocket");
30 alert("Dynamic connection with server can't be established, please try to reload this page in a while or contact your service administrator");
31 return;
32 }
33 var delay = Math.floor((Math.random() * 10) + 1) + 30 * Math.min(retried, 6);
34 notifyRetry(delay, function() {
35 retried++;
36 socket = new WebSocket(url, 'libervia_page_' + token );
37 socket.addEventListener('error', errorHandler);
38 });
39 };
40
41 socket.addEventListener('error', errorHandler);
42
43 if (debug) {
44 socket.addEventListener('message', function(event) {
45 console.log('WS in <== ', JSON.parse(event.data));
46 });
47 }
48
49 socket.addEventListener('message', function(event) {
50 try {data = JSON.parse(event.data);}
51 catch (e) {
52 console.warn('invalid websocket message received: %s', e);
53 return;
54 }
55 switch (data.type) {
56 case 'reload':
57 location.reload(true);
58 break;
59 case 'dom':
60 selected_element = document.body.querySelector(data.selectors);
61 switch (data.update_type) {
62 case 'append':
63 var template = document.createElement('template');
64 template.innerHTML = data.html.trim();
65 new_element = template.content.firstChild;
66 selected_element.appendChild(new_element);
67 break;
68 default:
69 console.warn('Unknown DOM update type: %s', data.update_type);
70 }
71 break;
72 default:
73 console.warn('Unknown data type: %s', data.type);
74 }
75 });
76
77 socket.addEventListener('open', function (event) {
78 console.log('Websocket opened');
79 retried = 0;
80 }.bind(this));
81
82 this.send = function(data) {
83 if (debug) {
84 console.log('WS out ==> ', data);
85 }
86 socket.send(JSON.stringify(data));
87 };
88
89 function notifyRetry(timeout, retryCb) {
90 /* Show a notification dialog informing the user that server can't be reach
91 * and call retryCb after timeout seconds.
92 * A "retry now" link allows to retry immediately"
93 *
94 * @param timeout(int): delay before retrying, in seconds
95 * @param retryCb(function): function to call when retrying
96 */
97 var startTime = Date.now() / 1000;
98 var retryIntervalID;
99 var notif = document.createElement("div");
100 notif.setAttribute('class', 'notification retry');
101 //FIXME: we use English without translation for now, must be changed when we can use gettext in Libervia pages
102 notif.innerHTML = "<p>Can't reach the server, retrying in <span id='retry_counter'></span> seconds</p><p><a id='retry_now'>retry now</a></p>";
103 document.body.appendChild(notif);
104 var retryCounter = document.getElementById('retry_counter');
105 retryCounter.textContent = timeout;
106
107 var retry = function () {
108 clearInterval(retryIntervalID);
109 notif.parentNode.removeChild(notif);
110 retryCb();
111 };
112
113 var updateTimer = function () {
114 var elapsed = Math.floor(Date.now() / 1000 - startTime);
115 var remaining = timeout - elapsed;
116 if (remaining < 0) {
117 retry();
118 }
119 else {
120 retryCounter.textContent = remaining;
121 }
122 };
123
124 var retryNow = document.getElementById('retry_now');
125 retryNow.addEventListener('click', function(){
126 retry();
127 });
128
129 retryIntervalID = setInterval(updateTimer, 1000);
130 }
131 }