auto-reload-brunch
Version:
Adds automatic browser reloading support to brunch.
88 lines (78 loc) • 2.85 kB
JavaScript
/* 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 */