This repository has been archived by the owner on Jun 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 30
/
auto-reload.js
88 lines (78 loc) · 2.78 KB
/
auto-reload.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
/* jshint ignore:start */
(function() {
var WebSocket = window.WebSocket || window.MozWebSocket;
var br = window.brunch = (window.brunch || {});
var ar = br['auto-reload'] = (br['auto-reload'] || {});
if (!WebSocket || ar.disabled) return;
if (window._ar) return;
window._ar = true;
var cacheBuster = function(url){
var date = Math.round(Date.now() / 1000).toString();
url = url.replace(/(\&|\\?)cacheBuster=\d*/, '');
return url + (url.indexOf('?') >= 0 ? '&' : '?') +'cacheBuster=' + date;
};
var browser = navigator.userAgent.toLowerCase();
var forceRepaint = ar.forceRepaint || browser.indexOf('chrome') > -1;
var reloaders = {
page: function(){
window.location.reload(true);
},
stylesheet: function(){
[].slice
.call(document.querySelectorAll('link[rel=stylesheet]'))
.filter(function(link) {
var val = link.getAttribute('data-autoreload');
return link.href && val != 'false';
})
.forEach(function(link) {
link.href = cacheBuster(link.href);
});
// Hack to force page repaint after 25ms.
if (forceRepaint) setTimeout(function() { document.body.offsetHeight; }, 25);
},
javascript: function(){
var scripts = [].slice.call(document.querySelectorAll('script'));
var textScripts = scripts.map(function(script) { return script.text }).filter(function(text) { return text.length > 0 });
var srcScripts = scripts.filter(function(script) { return script.src });
var loaded = 0;
var all = srcScripts.length;
var onLoad = function() {
loaded = loaded + 1;
if (loaded === all) {
textScripts.forEach(function(script) { eval(script); });
}
}
srcScripts
.forEach(function(script) {
var src = script.src;
script.remove();
var newScript = document.createElement('script');
newScript.src = cacheBuster(src);
newScript.async = true;
newScript.onload = onLoad;
document.head.appendChild(newScript);
});
}
};
var port = ar.port || 9485;
var host = ar.host || br.server || window.location.hostname || 'localhost';
var connect = function(){
var protocol = window.location.protocol == 'https:' ? 'wss://' : 'ws://';
var connection = new WebSocket(protocol + host + ':' + port);
connection.onmessage = function(event) {
var message = event.data;
var reloader = reloaders[message] || reloaders.page;
reloader();
};
connection.onerror = function(){
if (connection.readyState) connection.close();
};
connection.onclose = function(){
window.setTimeout(connect, 1000);
};
};
if(ar.disabled == undefined || !ar.disabled){
connect();
}
})();
/* jshint ignore:end */