mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-18 10:41:20 -08:00
refactor(tooling): [MOD-DEV-01] own dev server lifecycle and report port failures
This commit is contained in:
1 parent
401d4cdd65
commit
772d79a671
24 files changed
+1249
-132
No files matched your search
@@ -0,0 +1,60 @@
|
||||
import type { ServerResponse } from 'node:http'
|
||||
|
||||
export const reloadScript = `<script>(() => {
|
||||
const source = new EventSource('/livereload');
|
||||
let reloading = false;
|
||||
const reload = () => { if (!reloading) { reloading = true; location.reload(); } };
|
||||
source.onmessage = reload;
|
||||
source.onerror = () => { source.onopen = reload; };
|
||||
addEventListener('pagehide', () => source.close(), { once: true });
|
||||
})();</script>`
|
||||
|
||||
export function createReloadChannel() {
|
||||
const clients = new Set<ServerResponse>()
|
||||
let heartbeat: ReturnType<typeof setInterval> | undefined
|
||||
let closed = false
|
||||
function stopHeartbeat() {
|
||||
clearInterval(heartbeat)
|
||||
heartbeat = undefined
|
||||
}
|
||||
return {
|
||||
add(response: ServerResponse) {
|
||||
if (closed) {
|
||||
response.writeHead(503).end()
|
||||
return
|
||||
}
|
||||
response.writeHead(200, {
|
||||
'Content-Type': 'text/event-stream',
|
||||
'Cache-Control': 'no-cache',
|
||||
'Connection': 'keep-alive',
|
||||
})
|
||||
response.write('event: connected\ndata: ready\n\n')
|
||||
clients.add(response)
|
||||
response.once('close', () => {
|
||||
clients.delete(response)
|
||||
if (!clients.size)
|
||||
stopHeartbeat()
|
||||
})
|
||||
if (!heartbeat) {
|
||||
heartbeat = setInterval(() => {
|
||||
for (const client of clients)
|
||||
client.write('event: ping\ndata: waiting\n\n')
|
||||
}, 30000)
|
||||
heartbeat.unref()
|
||||
}
|
||||
},
|
||||
reload() {
|
||||
if (!closed) {
|
||||
for (const client of clients)
|
||||
client.write('data: reload\n\n')
|
||||
}
|
||||
},
|
||||
close() {
|
||||
closed = true
|
||||
stopHeartbeat()
|
||||
for (const client of clients)
|
||||
client.end()
|
||||
clients.clear()
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user