fix(archive): close metadata websocket on completion

This commit is contained in:
localhost 2026-08-20 18:25:29 +02:00
parent eb535c3405
commit 4e45a313b7
1 changed files with 43 additions and 26 deletions

View File

@ -1,37 +1,54 @@
import WebSocket from 'ws'; import WebSocket from 'ws'
async function downloadVideo(ws: any, id: string): Promise<{ fail: boolean, message: string, size: number }> { interface WsLike {
return new Promise(async (resolve, reject) => { send: (msg: string) => void
let isDownloading = true }
const downloader = new WebSocket(`ws://${(process.env.METADATA!).replace('http://', '')}/download/${id}`)
let size: number = 0
downloader.on('message', async function message(data: any) { async function downloadVideo(ws: WsLike, id: string): Promise<{ fail: boolean, message: string, size: number }> {
const text = data.toString() const { promise, resolve } = Promise.withResolvers<{ fail: boolean, message: string, size: number }>()
if (text.startsWith('VIDEOSIZE-')) { let isDownloading = true
size = parseInt(text.replace('VIDEOSIZE-', '')) const downloader = new WebSocket(`ws://${(process.env.METADATA!).replace('http://', '')}/download/${id}`)
} else if (text == 'done') { let size = 0
isDownloading = false
return resolve({
fail: false,
message: '',
size
})
} else {
ws.send(`DATA - ${text}`)
}
})
downloader.on('close', function close() {
if (!isDownloading) return
downloader.on('message', function message(data: unknown) {
const text = String(data)
if (text.startsWith('VIDEOSIZE-')) {
size = parseInt(text.replace('VIDEOSIZE-', ''))
} else if (text === 'done') {
isDownloading = false
downloader.close()
return resolve({ return resolve({
fail: true, fail: false,
message: 'The metadata server unexpectedly closed the websocket. Please try again.', message: '',
size size
}) })
} else {
ws.send(`DATA - ${text}`)
}
})
downloader.on('close', function close() {
if (!isDownloading) return
isDownloading = false
return resolve({
fail: true,
message: 'The metadata server unexpectedly closed the websocket. Please try again.',
size
}) })
}) })
downloader.on('error', function error(err: Error) {
if (!isDownloading) return
isDownloading = false
downloader.close()
return resolve({
fail: true,
message: `WebSocket error: ${err?.message || String(err)}`,
size
})
})
return promise
} }
export { downloadVideo } export { downloadVideo }