-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.js
45 lines (40 loc) · 1.19 KB
/
client.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
const socket = new WebSocket(`ws://${location.host}`)
const log = msg =>
console.log(
`%c[svelte-server]%c ${msg}`,
'background: darkslategray; color: white; display: block;',
''
)
const send = payload => {
const stringified = JSON.stringify(payload, null, 2)
socket.send(stringified)
}
log('HOT client loaded')
socket.addEventListener('message', async ({ data }) => {
const { type, path, name } = JSON.parse(data)
switch (type) {
case 'connected':
log(`connected`)
send({ type: 'handshake', url: location.pathname })
break
case 'change':
log(`File changed: ${name}`)
const { default: component } = await import(`/_js/${path}`)
const scrollY = window.scrollY;
new component({ target: document.body, hydrate: true, props: window.__SVELTE_PROPS__ })
window.scrollTo({ top: scrollY })
break
case 'unlink':
log(`File removed: ${name}`)
location.reload()
break
}
})
socket.addEventListener('close', () => {
log(`server connection lost. polling for restart...`)
setInterval(() => {
new WebSocket(`ws://${location.host}`).addEventListener('open', () => {
location.reload()
})
}, 1000)
})