import { Day } from '@/shared/model/day' import { parsePage, ParseResult, WeekInfo } from '@/app/parser/schedule' import contentTypeParser from 'content-type' import { JSDOM } from 'jsdom' // import { content as mockContent } from './mock' import { reportParserError } from '@/app/logger' import { PROXY_URL } from '@/shared/constants/urls' export type ScheduleResult = { days: Day[] currentWk?: number availableWeeks?: WeekInfo[] } // ПС-7: 146 export async function getSchedule(groupID: number, groupName: string, wk?: number, parseWeekNavigation: boolean = true): Promise { const url = `${PROXY_URL}/?mn=2&obj=${groupID}${wk ? `&wk=${wk}` : ''}` const page = await fetch(url) // const page = { text: async () => mockContent, status: 200, headers: { get: (s: string) => s && 'text/html' } } const content = await page.text() const contentType = page.headers.get('content-type') if (page.status === 200 && contentType && contentTypeParser.parse(contentType).type === 'text/html') { let dom: JSDOM | null = null try { dom = new JSDOM(content, { url }) const root = dom.window.document const result = parsePage(root, groupName, url, parseWeekNavigation) const scheduleResult = { days: result.days, currentWk: result.currentWk || wk, availableWeeks: result.availableWeeks } // Явно очищаем JSDOM для освобождения памяти dom.window.close() dom = null return scheduleResult } catch(e) { // Очищаем JSDOM даже в случае ошибки if (dom) { dom.window.close() } console.error(`Error while parsing ${PROXY_URL}`) reportParserError(new Date().toISOString(), 'Не удалось сделать парсинг для группы', groupName) throw e } } else { console.error(page.status, contentType) console.error(content.length > 500 ? content.slice(0, 500 - 3) + '...' : content) reportParserError(new Date().toISOString(), 'Не удалось получить страницу для группы', groupName) throw new Error(`Error while fetching ${PROXY_URL}`) } }