mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-09-26 22:49:14 +08:00
70 lines
2.0 KiB
TypeScript
70 lines
2.0 KiB
TypeScript
import exitHook from 'async-exit-hook'
|
|
import { Server } from 'http'
|
|
import { WebSocketServer } from 'ws'
|
|
import { Payload } from './payload'
|
|
import { stopInstance, watchers } from './registry-watcher'
|
|
|
|
let server: WebSocketServer
|
|
|
|
export const sendMessage = (message: Payload) => {
|
|
if (!server) {
|
|
return
|
|
}
|
|
const text = JSON.stringify(message)
|
|
server.clients.forEach(client => {
|
|
client.send(text)
|
|
})
|
|
}
|
|
export const exitWebSocketServer = () => {
|
|
if (!server) {
|
|
return
|
|
}
|
|
sendMessage({ type: 'stop' })
|
|
server.clients.forEach(c => c.close())
|
|
}
|
|
export const startWebSocketServer = (httpServer: Server) =>
|
|
new Promise<void>(resolve => {
|
|
server = new WebSocketServer({ server: httpServer })
|
|
server.on('connection', client => {
|
|
sendMessage({ type: 'start', sessions: watchers.map(it => it.url) })
|
|
client.on('message', data => {
|
|
try {
|
|
const payload: Payload = JSON.parse(data.toString())
|
|
console.log('收到 DevClient 消息:', payload)
|
|
switch (payload.type) {
|
|
default: {
|
|
break
|
|
}
|
|
case 'itemStop': {
|
|
const { path } = payload
|
|
const watcherIndex = watchers.findIndex(it => it.url === path)
|
|
if (watcherIndex !== -1) {
|
|
const [watcher] = watchers.splice(watcherIndex, 1)
|
|
stopInstance(watcher.instance, () => {
|
|
console.log(`功能编译器已退出: ${watcher.url}`)
|
|
})
|
|
}
|
|
break
|
|
}
|
|
case 'querySessions': {
|
|
sendMessage({ type: 'querySessionsResponse', sessions: watchers.map(it => it.url) })
|
|
break
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('无效信息', data)
|
|
}
|
|
})
|
|
})
|
|
server.on('error', error => console.error(error))
|
|
exitHook(exit =>
|
|
server.close(error => {
|
|
if (error) {
|
|
console.error(error)
|
|
}
|
|
exit()
|
|
}),
|
|
)
|
|
resolve()
|
|
})
|