전체 코드 재검토 기반의 안전한 개선 1차 배치. - 메인 설치기에 전역 uncaughtException/unhandledRejection 가드 추가. nat-upnp (detectExternalIpUpnp)의 비동기 소켓 오류로 앱이 조용히 종료되던 잠재 크래시 방지(포트포워딩 도구 v0.3.18 과 동일 대비). - 서버: fetchVideoMeta/fetchPlaylistEntries 에 http(s) URL 검증 추가(운영자 입력이 yt-dlp 플래그로 오인되는 인자 주입 차단). /file/mods/:folder/index.json 의 async throw → next(error) 로 위임(unhandledRejection 방지). index 라우트 pack 정의 병렬 로드. - 죽은 i18n 키 정리: installer 로케일의 UPnP/run.bat 관련 19개 + pf 로케일 2개 제거(코드에서 미참조 확인). 크래시 가드용 log.internalError, youtube.invalidUrl 추가. v0.3.23. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
24 lines
873 B
TypeScript
24 lines
873 B
TypeScript
import { Router } from 'express'
|
|
import { listPackKeys, loadPackDefinition, readManifest } from '../../shared/store.js'
|
|
|
|
export const indexRouter = Router()
|
|
|
|
indexRouter.get('/', async (_req, res, next) => {
|
|
try {
|
|
const manifest = await readManifest()
|
|
const definitionMap = new Map<string, Awaited<ReturnType<typeof loadPackDefinition>>>()
|
|
const keys = await listPackKeys()
|
|
// 팩 정의를 병렬 로드(op.ts 와 동일 패턴). 순차 await 보다 빠름.
|
|
const definitions = await Promise.all(keys.map((key) => loadPackDefinition(key)))
|
|
keys.forEach((key, i) => definitionMap.set(key, definitions[i]))
|
|
const packs = manifest.packs.map((entry) => ({
|
|
name: entry.name,
|
|
file: entry.file,
|
|
definition: definitionMap.get(entry.file) ?? null
|
|
}))
|
|
res.render('index', { packs })
|
|
} catch (error) {
|
|
next(error)
|
|
}
|
|
})
|