UNPKG

auto-reload-brunch

Version:

Adds automatic browser reloading support to brunch.

88 lines (78 loc) 2.85 kB
/* 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 */