UNPKG

1.84 kBJavaScriptView Raw
1var nanotiming = require('nanotiming')
2var logger = require('nanologger')
3var onIdle = require('on-idle')
4
5if (typeof window !== 'undefined') {
6 document.addEventListener('DOMContentLoaded', function () {
7 onIdle(initReload)
8 })
9}
10
11function initReload () {
12 var timing = nanotiming('bankai:reload')
13 var log = logger('bankai:reload')
14 var source = new window.EventSource('/reload')
15
16 source.addEventListener('open', function () {
17 log.info('connected')
18 })
19
20 source.addEventListener('message', function (event) {
21 try {
22 var ev = JSON.parse(event.data)
23 } catch (e) {
24 return log.error('error parsing event', e)
25 }
26 if (ev.type === 'styles') handleStyles(ev.bundle)
27 else if (ev.type === 'scripts') handleScripts()
28 }, false)
29
30 window.addEventListener('beforeunload', beforeunload)
31
32 // Done setting up!
33 timing()
34
35 function beforeunload (event) {
36 source.close()
37 }
38
39 function handleScripts () {
40 log.info('scripts', 'reloading')
41 window.location.reload()
42 }
43
44 function handleStyles (content) {
45 var node = document.createElement('style')
46 node.setAttribute('type', 'text/css')
47 node.textContent = content
48
49 log.info('styles', 'reloading')
50
51 var linkNode = document.querySelector('link')
52 if (linkNode) linkNode.parentNode.removeChild(linkNode)
53
54 var prevNode = document.querySelector('style')
55 if (prevNode) prevNode.parentNode.replaceChild(node, prevNode)
56 else document.head.appendChild(node)
57 }
58
59 source.addEventListener('error', function (event) {
60 if (event.target.readyState === window.EventSource.CLOSED) {
61 source.close()
62 log.info('closed')
63 } else if (event.target.readyState === window.EventSource.CONNECTING) {
64 log.warn('reconnecting')
65 } else {
66 log.error('connection closed: unknown error')
67 }
68 }, false)
69}