1 | var nanotiming = require('nanotiming')
|
2 | var logger = require('nanologger')
|
3 | var onIdle = require('on-idle')
|
4 |
|
5 | if (typeof window !== 'undefined') {
|
6 | document.addEventListener('DOMContentLoaded', function () {
|
7 | onIdle(initReload)
|
8 | })
|
9 | }
|
10 |
|
11 | function 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 |
|
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 | }
|