{"version":3,"file":"webuntis.mjs","sources":["../src/cookie.ts","../src/base-64.ts","../src/types.ts","../src/base.ts","../src/secret.ts","../src/qr.ts","../src/anonymous.ts"],"sourcesContent":["/**\n * Shamelessly stolen from @tinyhttp/cookie.\n *\n * Because @tinyhttp/cookie doesn't provide a commonjs build, I just decided to include the source code.\n * We need a cjs build, because we generate both esm and cjs.\n */\n\nconst pairSplitRegExp = /; */;\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar   = VCHAR / obs-text\n * obs-text      = %x80-FF\n */\n\n// eslint-disable-next-line no-control-regex\nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nfunction tryDecode(str: string, decode: (str: string) => string) {\n    try {\n        return decode(str);\n    } catch (e) {\n        return str;\n    }\n}\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n */\nexport function parse(\n    str: string,\n    options: {\n        decode: (str: string) => string;\n    } = {\n        decode: decodeURIComponent,\n    },\n): Record<string, string> {\n    const obj: Record<string, string> = {};\n    const pairs = str.split(pairSplitRegExp);\n\n    for (const pair of pairs) {\n        let eqIdx = pair.indexOf('=');\n\n        // skip things that don't look like key=value\n        if (eqIdx < 0) continue;\n\n        const key = pair.substr(0, eqIdx).trim();\n        let val = pair.substr(++eqIdx, pair.length).trim();\n\n        // quoted values\n        if ('\"' == val[0]) val = val.slice(1, -1);\n\n        // only assign once\n        if (obj[key] == null) obj[key] = tryDecode(val, options.decode);\n    }\n\n    return obj;\n}\n\nexport type SerializeOptions = Partial<{\n    encode: (str: string) => string;\n    maxAge: number;\n    domain: string;\n    path: string;\n    httpOnly: boolean;\n    secure: boolean;\n    sameSite: boolean | 'Strict' | 'strict' | 'Lax' | 'lax' | 'None' | 'none' | string;\n    expires: Date;\n}>;\n\nexport function serialize(name: string, val: string, opt: SerializeOptions = {}): string {\n    if (!opt.encode) opt.encode = encodeURIComponent;\n\n    if (!fieldContentRegExp.test(name)) throw new TypeError('argument name is invalid');\n\n    const value = opt.encode(val);\n\n    if (value && !fieldContentRegExp.test(value)) throw new TypeError('argument val is invalid');\n\n    let str = name + '=' + value;\n\n    if (null != opt.maxAge) {\n        const maxAge = opt.maxAge - 0;\n\n        if (isNaN(maxAge) || !isFinite(maxAge)) throw new TypeError('option maxAge is invalid');\n\n        str += '; Max-Age=' + Math.floor(maxAge);\n    }\n\n    if (opt.domain) {\n        if (!fieldContentRegExp.test(opt.domain)) throw new TypeError('option domain is invalid');\n\n        str += '; Domain=' + opt.domain;\n    }\n\n    if (opt.path) {\n        if (!fieldContentRegExp.test(opt.path)) throw new TypeError('option path is invalid');\n\n        str += '; Path=' + opt.path;\n    }\n\n    if (opt.expires) str += '; Expires=' + opt.expires.toUTCString();\n\n    if (opt.httpOnly) str += '; HttpOnly';\n\n    if (opt.secure) str += '; Secure';\n\n    if (opt.sameSite) {\n        const sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n        switch (sameSite) {\n            case true:\n            case 'strict':\n                str += '; SameSite=Strict';\n                break;\n            case 'lax':\n                str += '; SameSite=Lax';\n                break;\n            case 'none':\n                str += '; SameSite=None';\n                break;\n            default:\n                throw new TypeError('option sameSite is invalid');\n        }\n    }\n\n    return str;\n}\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nexport function btoa(input = '') {\n    let str = input;\n    let output = '';\n\n    for (\n        let block = 0, charCode, i = 0, map = chars;\n        str.charAt(i | 0) || ((map = '='), i % 1);\n        output += map.charAt(63 & (block >> (8 - (i % 1) * 8)))\n    ) {\n        charCode = str.charCodeAt((i += 3 / 4));\n\n        if (charCode > 0xff) {\n            throw new Error(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\");\n        }\n\n        block = (block << 8) | charCode;\n    }\n\n    return output;\n}\n","export interface SchoolYear {\n    name: string;\n    id: number;\n    startDate: Date;\n    endDate: Date;\n}\n\nexport interface MessagesOfDay {\n    id: number;\n    subject: string;\n    text: string;\n    isExpanded: boolean;\n    /**\n     * Unknown type. I have never seen this in use.\n     */\n    attachments: any[];\n}\n\nexport interface NewsWidget {\n    /**\n     * Unknown type. I have never seen this in use.\n     */\n    systemMessage: any;\n    messagesOfDay: MessagesOfDay[];\n    rssUrl: string;\n}\n\nexport interface Messagesender {\n    userId: number;\n    displayName: string;\n    imageUrl: string;\n    className: string;\n}\n\nexport interface Inboxmessage {\n    allowMessageDeletion: boolean;\n    contentPreview: string;\n    hasAttachments: boolean;\n    id: number;\n    isMessageRead: boolean;\n    isReply: boolean;\n    isReplyAllowed: boolean;\n    sender: Messagesender;\n    sentDateTime: string;\n    subject: string;\n}\n\nexport interface Inbox {\n    incomingMessages: Inboxmessage[];\n}\n\nexport interface ShortData {\n    id: number;\n    name: string;\n    longname: string;\n    orgname?: string;\n    orgid?: number;\n}\n\nexport interface Lesson {\n    id: number;\n    date: number;\n    startTime: number;\n    endTime: number;\n    kl: ShortData[];\n    te: ShortData[];\n    su: ShortData[];\n    ro: ShortData[];\n    lstext?: string;\n    lsnumber: number;\n    activityType?: 'Unterricht' | string;\n    code?: 'cancelled' | 'irregular';\n    info?: string;\n    substText?: string;\n    statflags?: string;\n    sg?: string;\n    bkRemark?: string;\n    bkText?: string;\n}\n\nexport interface Homework {\n    /**\n     * Unknown type. I have never seen this in use.\n     */\n    attachments: Array<any>;\n    completed: boolean;\n    date: number;\n    dueDate: number;\n    id: number;\n    lessonId: number;\n    remark: string;\n    text: string;\n}\n\nexport interface Subject {\n    id: number;\n    name: string;\n    longName: string;\n    alternateName: string | '';\n    active: boolean;\n    foreColor: string;\n    backColor: string;\n}\n\nexport enum WebUntisDay {\n    Sunday = 1,\n    Monday = 2,\n    Tuesday = 3,\n    Wednesday = 4,\n    Thursday = 5,\n    Friday = 6,\n    Saturday = 7,\n}\n\nexport interface TimeUnit {\n    name: string;\n    startTime: number;\n    endTime: number;\n}\n\nexport interface Timegrid {\n    day: WebUntisDay;\n    timeUnits: TimeUnit[];\n}\n\nexport interface Exam {\n    id: number;\n    examType: string;\n    name: string;\n    studentClass: string[];\n    assignedStudents: {\n        klasse: { id: number; name: string };\n        displayName: string;\n        id: number;\n    }[];\n    examDate: number;\n    startTime: number;\n    endTime: number;\n    subject: string;\n    teachers: string[];\n    rooms: string[];\n    text: string;\n    grade?: string;\n}\n\nexport enum WebUntisElementType {\n    CLASS = 1,\n    TEACHER = 2,\n    SUBJECT = 3,\n    ROOM = 4,\n    STUDENT = 5,\n}\n\nexport interface WebElement {\n    type: WebUntisElementType;\n    id: number;\n    orgId: number;\n    missing: boolean;\n    state: 'REGULAR' | 'ABSENT' | 'SUBSTITUTED';\n}\n\nexport interface WebElementData extends WebElement {\n    element: {\n        type: number;\n        id: number;\n        name: string;\n        longName?: string;\n        displayname?: string;\n        alternatename?: string;\n        canViewTimetable: boolean;\n        externalKey?: string;\n        roomCapacity: number;\n    };\n}\n\nexport interface WebAPITimetable {\n    id: number;\n    lessonId: number;\n    lessonNumber: number;\n    lessonCode: string;\n    lessonText: string;\n    periodText: string;\n    hasPeriodText: false;\n    periodInfo: string;\n    periodAttachments: [];\n    substText: string;\n    date: number;\n    startTime: number;\n    endTime: number;\n    elements: WebElement[];\n    studentGroup: string;\n    hasInfo: boolean;\n    code: number;\n    cellState: 'STANDARD' | 'SUBSTITUTION' | 'ROOMSUBSTITUTION';\n    priority: number;\n    is: {\n        roomSubstitution?: boolean;\n        substitution?: boolean;\n        standard?: boolean;\n        event: boolean;\n    };\n    roomCapacity: number;\n    studentCount: number;\n    classes: WebElementData[];\n    teachers: WebElementData[];\n    subjects: WebElementData[];\n    rooms: WebElementData[];\n    students: WebElementData[];\n}\n\nexport interface Teacher {\n    id: number;\n    name: string;\n    foreName: string;\n    longName: string;\n    foreColor: string;\n    backColor: string;\n}\n\nexport interface Student {\n    id: number;\n    key: number;\n    name: string;\n    foreName: string;\n    longName: string;\n    gender: string;\n}\n\nexport interface Room {\n    id: number;\n    name: string;\n    longName: string;\n    alternateName: string | '';\n    active: boolean;\n    foreColor: string;\n    backColor: string;\n}\n\nexport interface Klasse {\n    id: number;\n    name: string;\n    longName: string;\n    active: boolean;\n    foreColor?: string;\n    backColor?: string;\n    did?: number;\n    teacher1?: number;\n    teacher2?: number;\n}\n\nexport interface Department {\n    id: number;\n    name: string;\n    longName: string;\n}\n\nexport interface Holiday {\n    name: string;\n    longName: string;\n    id: number;\n    startDate: number;\n    endDate: number;\n}\n\nexport interface ColorEntity {\n    foreColor: string;\n    backColor: string;\n}\n\nexport interface LsEntity {\n    ls?: ColorEntity | null;\n    oh?: ColorEntity | null;\n    sb?: ColorEntity | null;\n    bs?: ColorEntity | null;\n    ex?: ColorEntity | null;\n}\n\nexport interface CodesEntity {\n    cancelled?: ColorEntity | null;\n    irregular?: ColorEntity | null;\n}\n\nexport interface StatusData {\n    lstypes: LsEntity[];\n    codes: CodesEntity[];\n}\n\nexport interface Absences {\n    absences: Absence[];\n    absenceReasons: [];\n    excuseStatuses: boolean;\n    showAbsenceReasonChange: boolean;\n    showCreateAbsence: boolean;\n}\n\nexport interface Absence {\n    id: number;\n    startDate: number;\n    endDate: number;\n    startTime: number;\n    endTime: number;\n    createDate: number;\n    lastUpdate: number;\n    createdUser: string;\n    updatedUser: string;\n    reasonId: number;\n    reason: string;\n    text: string;\n    interruptions: [];\n    canEdit: boolean;\n    studentName: string;\n    excuseStatus: string;\n    isExcused: boolean;\n    excuse: Excuse;\n}\n\nexport interface Excuse {\n    id: number;\n    text: string;\n    excuseDate: number;\n    excuseStatus: string;\n    isExcused: boolean;\n    userId: number;\n    username: string;\n}\n","import { serialize } from './cookie';\nimport axios from 'axios';\nimport { btoa } from './base-64';\nimport { parse as fnsParse, startOfDay, format, type ParseOptions } from 'date-fns';\nimport type { AxiosInstance } from 'axios';\nimport type {\n    Absences,\n    Department,\n    Exam,\n    Holiday,\n    Homework,\n    Inbox,\n    Klasse,\n    Lesson,\n    NewsWidget,\n    Room,\n    SchoolYear,\n    StatusData,\n    Student,\n    Subject,\n    Teacher,\n    Timegrid,\n    WebAPITimetable,\n} from './types';\nimport type { InternalSchoolYear, SessionInformation } from './internal';\nimport { WebUntisElementType } from './types';\n\n/**\n * Ensures that the dateStr is a string when calling {@link fnsParse}.\n * This is needed since some WebUntis servers return numbers instead of strings.\n * @param dateStr {string | number}\n * @param formatStr {string}\n * @param referenceDate {DateType | number | string}\n * @param options {ParseOptions | undefined}\n * @returns \n */\nconst parse = <DateType extends Date>(\n    dateStr: string | number,\n    formatStr: string,\n    referenceDate: DateType | number | string,\n    options?: ParseOptions,\n) => {\n    return fnsParse(`${dateStr}`, formatStr, referenceDate, options);\n};\n\nexport class Base {\n    school: string;\n    schoolbase64: string;\n    username: string;\n    password: string;\n    baseurl: string;\n    cookies: string[];\n    id: string;\n    sessionInformation: SessionInformation | null;\n    anonymous: boolean;\n\n    axios: AxiosInstance;\n\n    static TYPES = WebUntisElementType;\n\n    /**\n     *\n     * @constructor\n     * @param {string} school The school identifier\n     * @param {string} username\n     * @param {string} password\n     * @param {string} baseurl Just the host name of your WebUntis (Example: mese.webuntis.com)\n     * @param {string} [identity=\"Awesome\"] A identity like: MyAwesomeApp\n     * @param {boolean} [disableUserAgent=false] If this is true, axios will not send a custom User-Agent\n     */\n    constructor(\n        school: string,\n        username: string,\n        password: string,\n        baseurl: string,\n        identity = 'Awesome',\n        disableUserAgent = false,\n    ) {\n        this.school = school;\n        this.schoolbase64 = '_' + btoa(this.school);\n        this.username = username;\n        this.password = password;\n        this.baseurl = 'https://' + baseurl + '/';\n        this.cookies = [];\n        this.id = identity;\n        this.sessionInformation = {};\n        this.anonymous = false;\n\n        const additionalHeaders: Record<string, string> = {};\n\n        if (!disableUserAgent) {\n            additionalHeaders['User-Agent'] =\n                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36';\n        }\n\n        this.axios = axios.create({\n            baseURL: this.baseurl,\n            maxRedirects: 0,\n            headers: {\n                'Cache-Control': 'no-cache',\n                Pragma: 'no-cache',\n                'X-Requested-With': 'XMLHttpRequest',\n                ...additionalHeaders,\n            },\n            validateStatus: function (status) {\n                return status >= 200 && status < 303; // default\n            },\n        });\n    }\n\n    /**\n     * Logout the current session\n     */\n    async logout(): Promise<boolean> {\n        await this.axios({\n            method: 'POST',\n            url: `/WebUntis/jsonrpc.do`,\n            params: {\n                school: this.school,\n            },\n            data: {\n                id: this.id,\n                method: 'logout',\n                params: {},\n                jsonrpc: '2.0',\n            },\n        });\n        this.sessionInformation = null;\n        return true;\n    }\n\n    /**\n     * Login with your credentials\n     *\n     * **Notice: The server may revoke this session after less than 10min of idle.**\n     *\n     * *Untis says in the official docs:*\n     * > An application should always log out as soon as possible to free system resources on the server.\n     */\n    async login(): Promise<SessionInformation> {\n        const response = await this.axios({\n            method: 'POST',\n            url: `/WebUntis/jsonrpc.do`,\n            params: {\n                school: this.school,\n            },\n            data: {\n                id: this.id,\n                method: 'authenticate',\n                params: {\n                    user: this.username,\n                    password: this.password,\n                    client: this.id,\n                },\n                jsonrpc: '2.0',\n            },\n        });\n        if (typeof response.data !== 'object') throw new Error('Failed to parse server response.');\n        if (!response.data.result) throw new Error('Failed to login. ' + JSON.stringify(response.data));\n        if (response.data.result.code) throw new Error('Login returned error code: ' + response.data.result.code);\n        if (!response.data.result.sessionId) throw new Error('Failed to login. No session id.');\n        this.sessionInformation = response.data.result;\n        return response.data.result;\n    }\n\n    /**\n     * Get the latest WebUntis Schoolyear\n     * @param {Boolean} [validateSession=true]\n     */\n    async getLatestSchoolyear(validateSession = true): Promise<SchoolYear> {\n        const data = await this._request<InternalSchoolYear[]>('getSchoolyears', {}, validateSession);\n        data.sort((a, b) => {\n            const na = parse(a.startDate, 'yyyyMMdd', new Date());\n            const nb = parse(b.startDate, 'yyyyMMdd', new Date());\n            return nb.getTime() - na.getTime();\n        });\n        if (!data[0]) throw new Error('Failed to receive school year');\n        return {\n            name: data[0].name,\n            id: data[0].id,\n            startDate: parse(data[0].startDate, 'yyyyMMdd', new Date()),\n            endDate: parse(data[0].endDate, 'yyyyMMdd', new Date()),\n        };\n    }\n\n    /**\n     * Get all WebUntis Schoolyears\n     * @param {Boolean} [validateSession=true]\n     */\n    async getSchoolyears(validateSession = true): Promise<SchoolYear[]> {\n        const data = await this._request<InternalSchoolYear[]>('getSchoolyears', {}, validateSession);\n        data.sort((a, b) => {\n            const na = parse(a.startDate, 'yyyyMMdd', new Date());\n            const nb = parse(b.startDate, 'yyyyMMdd', new Date());\n            return nb.getTime() - na.getTime();\n        });\n        if (!data[0]) throw new Error('Failed to receive school year');\n        return data.map((year) => {\n            return {\n                name: year.name,\n                id: year.id,\n                startDate: parse(year.startDate, 'yyyyMMdd', new Date()),\n                endDate: parse(year.endDate, 'yyyyMMdd', new Date()),\n            };\n        });\n    }\n\n    /**\n     * Get News Widget\n     * @param {Date} date\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise<Object>} see index.d.ts NewsWidget\n     */\n    async getNewsWidget(date: Date, validateSession = true): Promise<NewsWidget> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/public/news/newsWidgetData`,\n            params: {\n                date: Base.convertDateToUntis(date),\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof response.data.data !== 'object') throw new Error('Server returned invalid data.');\n        return response.data.data;\n    }\n\n    /**\n     * Get Inbox\n     */\n    async getInbox(validateSession = true): Promise<Inbox> {\n        this._checkAnonymous();\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        //first get JWT Token\n        if (typeof this.sessionInformation!.jwt_token != 'string') await this._getJWT();\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/rest/view/v1/messages`,\n            headers: {\n                Authorization: `Bearer ${this.sessionInformation!.jwt_token}`,\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof response.data !== 'object') throw new Error('Server returned invalid data.');\n        return response.data;\n    }\n\n    private _checkAnonymous() {\n        if (this.anonymous) {\n            throw new Error('This method is not supported with anonymous login');\n        }\n    }\n\n    /**\n     *\n     * @returns {string}\n     * @private\n     */\n    _buildCookies() {\n        let cookies = [];\n        cookies.push(serialize('JSESSIONID', this.sessionInformation!.sessionId!));\n        cookies.push(serialize('schoolname', this.schoolbase64));\n        return cookies.join('; ');\n    }\n\n    /**\n     * Get JWT Token\n     * @private\n     */\n    async _getJWT(validateSession = true): Promise<string> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/token/new`,\n            headers: {\n                //Authorization: `Bearer ${this._getToken()}`,\n                Cookie: this._buildCookies(),\n            },\n        });\n\n        if (typeof response.data !== 'string') throw new Error('Server returned invalid data.');\n        this.sessionInformation!.jwt_token = response.data;\n        return response.data;\n    }\n\n    /**\n     * Checks if your current WebUntis Session is valid\n     */\n    async validateSession(): Promise<boolean> {\n        if (!this.sessionInformation) return false;\n        const response = await this.axios({\n            method: 'POST',\n            url: `/WebUntis/jsonrpc.do`,\n            params: {\n                school: this.school,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n            data: {\n                id: this.id,\n                method: 'getLatestImportTime',\n                params: {},\n                jsonrpc: '2.0',\n            },\n        });\n        return typeof response.data.result === 'number';\n    }\n\n    /**\n     * Get the time when WebUntis last changed its data\n     * @param {Boolean} [validateSession=true]\n     */\n    async getLatestImportTime(validateSession = true): Promise<number> {\n        return this._request('getLatestImportTime', {}, validateSession);\n    }\n\n    /**\n     *\n     * @param id\n     * @param type\n     * @param startDate\n     * @param endDate\n     * @param validateSession\n     * @private\n     */\n    private async _timetableRequest(\n        id: string | number,\n        type: number,\n        startDate?: Date | null,\n        endDate?: Date | null,\n        validateSession = true,\n    ): Promise<Lesson[]> {\n        const additionalOptions: Record<string, unknown> = {};\n        if (startDate) {\n            additionalOptions.startDate = Base.convertDateToUntis(startDate);\n        }\n        if (endDate) {\n            additionalOptions.endDate = Base.convertDateToUntis(endDate);\n        }\n\n        return this._request(\n            'getTimetable',\n            {\n                options: {\n                    id: new Date().getTime(),\n                    element: {\n                        id,\n                        type,\n                    },\n                    ...additionalOptions,\n                    showLsText: true,\n                    showStudentgroup: true,\n                    showLsNumber: true,\n                    showSubstText: true,\n                    showInfo: true,\n                    showBooking: true,\n                    klasseFields: ['id', 'name', 'longname', 'externalkey'],\n                    roomFields: ['id', 'name', 'longname', 'externalkey'],\n                    subjectFields: ['id', 'name', 'longname', 'externalkey'],\n                    teacherFields: ['id', 'name', 'longname', 'externalkey'],\n                },\n            },\n            validateSession,\n        );\n    }\n\n    /**\n     * Get your own Timetable for the current day\n     * Note: You can't use this with anonymous login\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise<Array>}\n     */\n    async getOwnTimetableForToday(validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(\n            this.sessionInformation!.personId!,\n            this.sessionInformation!.personType!,\n            null,\n            null,\n            validateSession,\n        );\n    }\n\n    /**\n     * Get the timetable of today for a specific element.\n     * @param {number} id\n     * @param {WebUntisElementType} type\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise<Array>}\n     */\n    async getTimetableForToday(id: number, type: number, validateSession = true): Promise<Lesson[]> {\n        return await this._timetableRequest(id, type, null, null, validateSession);\n    }\n\n    /**\n     * Get your own Timetable for the given day\n     * Note: You can't use this with anonymous login\n     * @param {Date} date\n     * @param {Boolean} [validateSession=true]\n     */\n    async getOwnTimetableFor(date: Date, validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(\n            this.sessionInformation!.personId!,\n            this.sessionInformation!.personType!,\n            date,\n            date,\n            validateSession,\n        );\n    }\n\n    /**\n     * Get the timetable for a specific day for a specific element.\n     * @param {Date} date\n     * @param {number} id\n     * @param {WebUntisElementType} type\n     * @param {Boolean} [validateSession=true]\n     */\n    async getTimetableFor(date: Date, id: number, type: number, validateSession = true): Promise<Lesson[]> {\n        return await this._timetableRequest(id, type, date, date, validateSession);\n    }\n\n    /**\n     * Get your own timetable for a given Date range\n     * Note: You can't use this with anonymous login\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getOwnTimetableForRange(rangeStart: Date, rangeEnd: Date, validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(\n            this.sessionInformation!.personId!,\n            this.sessionInformation!.personType!,\n            rangeStart,\n            rangeEnd,\n            validateSession,\n        );\n    }\n\n    /**\n     * Get the timetable for a given Date range for specific element\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {number} id\n     * @param {WebUntisElementType} type\n     * @param {Boolean} [validateSession=true]\n     */\n    async getTimetableForRange(\n        rangeStart: Date,\n        rangeEnd: Date,\n        id: number,\n        type: number,\n        validateSession = true,\n    ): Promise<Lesson[]> {\n        return await this._timetableRequest(id, type, rangeStart, rangeEnd, validateSession);\n    }\n\n    /**\n     * Get the Timetable of your class for today\n     * Note: You can't use this with anonymous login\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise<Array>}\n     */\n    async getOwnClassTimetableForToday(validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(this.sessionInformation!.klasseId!, 1, null, null, validateSession);\n    }\n\n    /**\n     * Get the Timetable of your class for the given day\n     * Note: You can't use this with anonymous login\n     * @param {Date} date\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getOwnClassTimetableFor(date: Date, validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(this.sessionInformation!.klasseId!, 1, date, date, validateSession);\n    }\n\n    /**\n     * Get the Timetable of your class for a given Date range\n     * Note: You can't use this with anonymous login\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {boolean} [validateSession=true]\n     */\n    async getOwnClassTimetableForRange(rangeStart: Date, rangeEnd: Date, validateSession = true): Promise<Lesson[]> {\n        this._checkAnonymous();\n        return await this._timetableRequest(\n            this.sessionInformation!.klasseId!,\n            1,\n            rangeStart,\n            rangeEnd,\n            validateSession,\n        );\n    }\n\n    /**\n     *\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getHomeWorksFor(rangeStart: Date, rangeEnd: Date, validateSession = true): Promise<Homework[]> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/homeworks/lessons`,\n            params: {\n                startDate: Base.convertDateToUntis(rangeStart),\n                endDate: Base.convertDateToUntis(rangeEnd),\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof response.data.data !== 'object') throw new Error('Server returned invalid data.');\n        if (!response.data.data['homeworks']) throw new Error(\"Data object doesn't contains homeworks object.\");\n        return response.data.data;\n    }\n\n    /**\n     * Converts the untis date string format to a normal JS Date object\n     * @param {string} date Untis date string\n     * @param {Date} [baseDate=new Date()] Base date. Default beginning of current day\n     * @static\n     */\n    static convertUntisDate(date: string, baseDate = startOfDay(new Date())): Date {\n        if (typeof date !== 'string') date = `${date}`;\n        return parse(date, 'yyyyMMdd', baseDate);\n    }\n\n    /**\n     * Convert a untis time string to a JS Date object\n     * @param {string|number} time Untis time string\n     * @param {Date} [baseDate=new Date()] Day used as base for the time. Default: Current date\n     * @static\n     */\n    static convertUntisTime(time: number | string, baseDate = new Date()): Date {\n        if (typeof time !== 'string') time = `${time}`;\n        return parse(time.padStart(4, '0'), 'Hmm', baseDate);\n    }\n\n    /**\n     * Get all known Subjects for the current logged-in user\n     * @param {boolean} [validateSession=true]\n     */\n    async getSubjects(validateSession = true): Promise<Subject[]> {\n        return await this._request('getSubjects', {}, validateSession);\n    }\n\n    /**\n     * Get the timegrid of current school\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getTimegrid(validateSession = true): Promise<Timegrid[]> {\n        return await this._request('getTimegridUnits', {}, validateSession);\n    }\n\n    /**\n     *\n     * TODO: Find out what type this function returns\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<void>}\n     */\n    async getHomeWorkAndLessons(rangeStart: Date, rangeEnd: Date, validateSession = true): Promise<Array<any>> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/homeworks/lessons`,\n            params: {\n                startDate: Base.convertDateToUntis(rangeStart),\n                endDate: Base.convertDateToUntis(rangeEnd),\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof response.data.data !== 'object') throw new Error('Server returned invalid data.');\n        if (!response.data.data['homeworks']) throw new Error(\"Data object doesn't contains homeworks object.\");\n        return response.data.data;\n    }\n\n    /**\n     * Get Exams for range\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {Number} klasseId\n     * @param {boolean} withGrades\n     * @param {boolean} [validateSession=true]\n     */\n    async getExamsForRange(\n        rangeStart: Date,\n        rangeEnd: Date,\n        klasseId = -1,\n        withGrades = false,\n        validateSession = true,\n    ): Promise<Array<Exam>> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/exams`,\n            params: {\n                startDate: Base.convertDateToUntis(rangeStart),\n                endDate: Base.convertDateToUntis(rangeEnd),\n                klasseId: klasseId,\n                withGrades: withGrades,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof response.data.data !== 'object') throw new Error('Server returned invalid data.');\n        if (!response.data.data['exams']) throw new Error(\"Data object doesn't contains exams object.\");\n        return response.data.data['exams'];\n    }\n\n    /**\n     * Get the timetable for the current week for a specific element from the web client API.\n     * @param {Date} date one date in the week to query\n     * @param {number} id element id\n     * @param {WebUntisElementType} type element type\n     * @param {Number} [formatId=1] set to 1 to include teachers, 2 omits the teachers in elements response\n     * @param {Boolean} [validateSession=true]\n     */\n    async getTimetableForWeek(\n        date: Date,\n        id: number,\n        type: number,\n        formatId = 1,\n        validateSession = true,\n    ): Promise<WebAPITimetable[]> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/public/timetable/weekly/data`,\n            params: {\n                elementType: type,\n                elementId: id,\n                date: format(date, 'yyyy-MM-dd'),\n                formatId: formatId,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n\n        if (typeof response.data.data !== 'object') throw new Error('Server returned invalid data.');\n\n        if (response.data.data.error) {\n            /* known codes:\n             * - ERR_TTVIEW_NOTALLOWED_ONDATE\n             */\n            const err = new Error('Server responded with error');\n            // TODO: Make this better lol\n            // @ts-ignore\n            err.code = response.data.data.error?.data?.messageKey;\n            throw err;\n        }\n\n        if (!response.data.data.result?.data?.elementPeriods?.[id]) throw new Error('Invalid response');\n\n        const data = response.data.data.result.data;\n\n        // TODO: improve typings\n\n        const formatElements = (elements: Array<Record<string, unknown>>, { byType }: { byType: number }) => {\n            const filteredElements = elements.filter((element) => element.type === byType);\n\n            return filteredElements.map((element) => ({\n                ...element,\n                element: data.elements.find(\n                    (dataElement: Record<string, unknown>) =>\n                        dataElement.type === byType && dataElement.id === element.id,\n                ),\n            }));\n        };\n\n        const timetable = data.elementPeriods[id].map((lesson: any) => ({\n            ...lesson,\n            classes: formatElements(lesson.elements, { byType: Base.TYPES.CLASS }),\n            teachers: formatElements(lesson.elements, { byType: Base.TYPES.TEACHER }),\n            subjects: formatElements(lesson.elements, { byType: Base.TYPES.SUBJECT }),\n            rooms: formatElements(lesson.elements, { byType: Base.TYPES.ROOM }),\n            students: formatElements(lesson.elements, { byType: Base.TYPES.STUDENT }),\n        }));\n\n        return timetable;\n    }\n\n    /**\n     * Get the timetable for the current week for the current element from the web client API.\n     * @param {Date} date one date in the week to query\n     * @param {Number} [formatId=1] set to 1 to include teachers, 2 omits the teachers in elements response\n     * @param {Boolean} [validateSession=true]\n     * @returns {Promise<WebAPITimetable[]>}\n     */\n    async getOwnTimetableForWeek(date: Date, formatId = 1, validateSession = true): Promise<WebAPITimetable[]> {\n        this._checkAnonymous();\n        return await this.getTimetableForWeek(\n            date,\n            this.sessionInformation!.personId!,\n            this.sessionInformation!.personType!,\n            formatId,\n            validateSession,\n        );\n    }\n\n    /**\n     * Get all known teachers by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getTeachers(validateSession = true): Promise<Teacher[]> {\n        return await this._request('getTeachers', {}, validateSession);\n    }\n\n    /**\n     * Get all known students by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getStudents(validateSession = true): Promise<Student[]> {\n        return await this._request('getStudents', {}, validateSession);\n    }\n\n    /**\n     * Get all known rooms by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getRooms(validateSession = true): Promise<Room[]> {\n        return await this._request('getRooms', {}, validateSession);\n    }\n\n    /**\n     * Get all classes known by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @param {number} schoolyearId\n     * @returns {Promise.<Array>}\n     */\n    async getClasses(validateSession = true, schoolyearId: number): Promise<Klasse[]> {\n        const data = typeof schoolyearId !== 'number' ? {} : { schoolyearId };\n        return await this._request('getKlassen', data, validateSession);\n    }\n\n    /**\n     * Get all departments known by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getDepartments(validateSession = true): Promise<Department[]> {\n        return await this._request('getDepartments', {}, validateSession);\n    }\n\n    /**\n     * Get all holidays known by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getHolidays(validateSession = true): Promise<Holiday[]> {\n        return await this._request('getHolidays', {}, validateSession);\n    }\n\n    /**\n     * Get all status data known by WebUntis\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise.<Array>}\n     */\n    async getStatusData(validateSession = true): Promise<StatusData> {\n        return await this._request('getStatusData', {}, validateSession);\n    }\n\n    /**\n     * Get the current school year\n     * @param [validateSession=true]\n     * @returns {Promise.<SchoolYear>}\n     */\n    async getCurrentSchoolyear(validateSession = true): Promise<SchoolYear> {\n        const data = await this._request<InternalSchoolYear>('getCurrentSchoolyear', {}, validateSession);\n\n        if (!data) throw new Error('Failed to retrieve current school year');\n\n        return {\n            name: data.name,\n            id: data.id,\n            startDate: Base.convertUntisDate(data.startDate),\n            endDate: Base.convertUntisDate(data.endDate),\n        };\n    }\n\n    /**\n     * Convert a JS Date Object to a WebUntis date string\n     * @param {Date} date\n     * @returns {String}\n     */\n    static convertDateToUntis(date: Date): string {\n        return (\n            date.getFullYear().toString() +\n            (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1).toString() +\n            (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()).toString()\n        );\n    }\n\n    /**\n     * Make a JSON RPC Request with the current session\n     * @param {string} method\n     * @param {Object} [parameter={}]\n     * @param {string} [url='/WebUntis/jsonrpc.do?school=SCHOOL']\n     * @param {boolean} [validateSession=true] Whether the session should be checked first\n     * @returns {Promise.<any>}\n     * @private\n     */\n    async _request<Response = Record<string, any>>(\n        method: string,\n        parameter: Record<string, any> = {},\n        validateSession = true,\n        url = `/WebUntis/jsonrpc.do`,\n    ): Promise<Response> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        const response = await this.axios({\n            method: 'POST',\n            url: url,\n            params: {\n                school: this.school,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n            data: {\n                id: this.id,\n                method: method,\n                params: parameter,\n                jsonrpc: '2.0',\n            },\n        });\n        if (!response.data.result) throw new Error(\"Server didn't return any result.\");\n        if (response.data.result.code) throw new Error('Server returned error code: ' + response.data.result.code);\n        return response.data.result;\n    }\n\n    /**\n     * Returns all the Lessons where you were absent including the excused one!\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {Integer} [excuseStatusId=-1]\n     * @param {boolean} [validateSession=true]\n     * @returns {Promise<Absences>}\n     */\n    async getAbsentLesson(\n        rangeStart: Date,\n        rangeEnd: Date,\n        excuseStatusId = -1,\n        validateSession = true,\n    ): Promise<Absences> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        this._checkAnonymous();\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/api/classreg/absences/students`,\n            params: {\n                startDate: Base.convertDateToUntis(rangeStart),\n                endDate: Base.convertDateToUntis(rangeEnd),\n                studentId: this.sessionInformation!.personId!,\n                excuseStatusId: excuseStatusId,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (response.data.data == null) throw new Error('Server returned no data!');\n        return response.data.data;\n    }\n\n    /**\n     * Returns a URL to a unique PDF of all the lessons you were absent\n     * @param {Date} rangeStart\n     * @param {Date} rangeEnd\n     * @param {boolean} [validateSession=true]\n     * @param {Integer} [excuseStatusId=-1]\n     * @param {boolean} [lateness=true]\n     * @param {boolean} [absences=true]\n     * @param {boolean} [excuseGroup=2]\n     */\n    async getPdfOfAbsentLesson(\n        rangeStart: Date,\n        rangeEnd: Date,\n        validateSession = true,\n        excuseStatusId = -1,\n        lateness = true,\n        absences = true,\n        excuseGroup = 2,\n    ): Promise<string> {\n        if (validateSession && !(await this.validateSession())) throw new Error('Current Session is not valid');\n        this._checkAnonymous();\n        const response = await this.axios({\n            method: 'GET',\n            url: `/WebUntis/reports.do`,\n            params: {\n                name: 'Excuse',\n                format: 'pdf',\n                rpt_sd: Base.convertDateToUntis(rangeStart),\n                rpt_ed: Base.convertDateToUntis(rangeEnd),\n                excuseStatusId: excuseStatusId,\n                studentId: this.sessionInformation!.personId!,\n                withLateness: lateness,\n                withAbsences: absences,\n                execuseGroup: excuseGroup,\n            },\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        const res = response.data.data;\n        if (response.status != 200 || res.error) throw new Error('Server returned no data!');\n        const pdfDownloadURL =\n            this.baseurl + 'WebUntis/reports.do?' + 'msgId=' + res.messageId + '&' + res.reportParams;\n        return pdfDownloadURL;\n    }\n}\n\n/**\n * @private\n */\nexport class InternalWebuntisSecretLogin extends Base {\n    constructor(\n        school: string,\n        username: string,\n        password: string,\n        baseurl: string,\n        identity = 'Awesome',\n        disableUserAgent = false,\n    ) {\n        super(school, username, password, baseurl, identity, disableUserAgent);\n    }\n\n    async _otpLogin(token: number | string, username: string, time: number, skipSessionInfo = false) {\n        const response = await this.axios({\n            method: 'POST',\n            url: '/WebUntis/jsonrpc_intern.do',\n            params: {\n                m: 'getUserData2017',\n                school: this.school,\n                v: 'i2.2',\n            },\n            data: {\n                id: this.id,\n                method: 'getUserData2017',\n                params: [\n                    {\n                        auth: {\n                            clientTime: time,\n                            user: username,\n                            otp: token,\n                        },\n                    },\n                ],\n                jsonrpc: '2.0',\n            },\n        });\n        if (response.data && response.data.error)\n            throw new Error('Failed to login. ' + (response.data.error.message || ''));\n        if (!response.headers['set-cookie']) throw new Error(`Failed to login. Server didn't return a set-cookie`);\n        if (!this._getCookieFromSetCookie(response.headers['set-cookie']))\n            throw new Error(\"Failed to login. Server didn't return a session id.\");\n        const sessionId = this._getCookieFromSetCookie(response.headers['set-cookie']);\n        // Set session temporary\n        this.sessionInformation = {\n            sessionId: sessionId,\n        };\n        if (skipSessionInfo) return this.sessionInformation;\n\n        // Get personId & personType\n        const appConfigUrl = `/WebUntis/api/app/config`;\n        const configResponse = await this.axios({\n            method: 'GET',\n            url: appConfigUrl,\n            headers: {\n                Cookie: this._buildCookies(),\n            },\n        });\n        if (typeof configResponse.data !== 'object' || typeof configResponse.data.data !== 'object')\n            throw new Error('Failed to fetch app config while login. data (type): ' + typeof response.data);\n        // Path -> data.loginServiceConfig.user.persons -> find person with id\n        if (\n            configResponse.data.data &&\n            configResponse.data.data.loginServiceConfig &&\n            configResponse.data.data.loginServiceConfig.user &&\n            !Number.isInteger(configResponse.data.data.loginServiceConfig.user.personId)\n        )\n            throw new Error('Invalid personId. personId: ' + configResponse.data.data.loginServiceConfig.user.personId);\n        const webUntisLoginServiceUser = configResponse.data.data.loginServiceConfig.user;\n        if (!Array.isArray(webUntisLoginServiceUser.persons))\n            throw new Error('Invalid person array. persons (type): ' + typeof webUntisLoginServiceUser.persons);\n        const person = webUntisLoginServiceUser.persons.find(\n            (value: Record<string, unknown>) => value.id === configResponse.data.data.loginServiceConfig.user.personId,\n        );\n        if (!person) throw new Error('Can not find person in person array.');\n        if (!Number.isInteger(person.type)) throw new Error('Invalid person type. type (type): ' + person.type);\n        this.sessionInformation = {\n            sessionId: sessionId,\n            personType: person.type,\n            personId: configResponse.data.data.loginServiceConfig.user.personId,\n        };\n        // Get klasseId\n        try {\n            const dayConfigUrl = `/WebUntis/api/daytimetable/config`;\n            const dayConfigResponse = await this.axios({\n                method: 'GET',\n                url: dayConfigUrl,\n                headers: {\n                    Cookie: this._buildCookies(),\n                },\n            });\n            if (typeof dayConfigResponse.data !== 'object' || typeof dayConfigResponse.data.data !== 'object')\n                throw new Error();\n            if (!Number.isInteger(dayConfigResponse.data.data.klasseId)) throw new Error();\n            this.sessionInformation = {\n                sessionId: sessionId,\n                personType: person.type,\n                personId: configResponse.data.data.loginServiceConfig.user.personId,\n                klasseId: dayConfigResponse.data.data.klasseId,\n            };\n        } catch (e) {\n            // klasseId is not important. This request can fail\n        }\n        return this.sessionInformation;\n    }\n\n    /**\n     *\n     * @param {Array} setCookieArray\n     * @param {string} [cookieName=\"JSESSIONID\"]\n     * @return {string|boolean}\n     * @private\n     */\n    _getCookieFromSetCookie(setCookieArray?: string[], cookieName = 'JSESSIONID') {\n        if (!setCookieArray) return;\n        for (let i = 0; i < setCookieArray.length; i++) {\n            const setCookie = setCookieArray[i];\n            if (!setCookie) continue;\n            let cookieParts = setCookie.split(';');\n            if (!cookieParts || !Array.isArray(cookieParts)) continue;\n            for (let cookie of cookieParts) {\n                cookie = cookie.trim();\n                cookie = cookie.replace(/;/gm, '');\n                const [Key, Value] = cookie.split('=');\n                if (!Key || !Value) continue;\n                if (Key === cookieName) return Value;\n            }\n        }\n    }\n}\n","import { InternalWebuntisSecretLogin } from './base';\nimport type { authenticator } from 'otplib';\n\nexport type Authenticator = typeof authenticator;\n\nexport class WebUntisSecretAuth extends InternalWebuntisSecretLogin {\n    private readonly secret: string;\n    private authenticator: Authenticator;\n\n    /**\n     *\n     * @constructor\n     * @augments WebUntis\n     * @param {string} school The school identifier\n     * @param {string} user\n     * @param {string} secret\n     * @param {string} baseurl Just the host name of your WebUntis (Example: mese.webuntis.com)\n     * @param {string} [identity=\"Awesome\"] A identity like: MyAwesomeApp\n     * @param {Object} authenticator Custom otplib v12 instance. Default will use the default otplib configuration.\n     * @param {boolean} [disableUserAgent=false] If this is true, axios will not send a custom User-Agent\n     */\n    constructor(\n        school: string,\n        user: string,\n        secret: string,\n        baseurl: string,\n        identity = 'Awesome',\n        authenticator: Authenticator,\n        disableUserAgent = false,\n    ) {\n        super(school, user, null as unknown as string, baseurl, identity, disableUserAgent);\n        this.secret = secret;\n        this.authenticator = authenticator;\n        if (!authenticator) {\n            if ('import' in globalThis) {\n                throw new Error(\n                    'You need to provide the otplib object by yourself. We can not eval the require in ESM mode.',\n                );\n            }\n            // React-Native will not eval this expression\n            const { authenticator } = eval(\"require('otplib')\");\n            this.authenticator = authenticator;\n        }\n    }\n\n    // @ts-ignore\n    async login() {\n        // Get JSESSION\n        const token = this.authenticator.generate(this.secret);\n        const time = new Date().getTime();\n        return await this._otpLogin(token, this.username, time);\n    }\n}\n","import { WebUntisSecretAuth } from './secret';\nimport type { Authenticator } from './secret';\nimport type { URL } from 'url';\n\n/**\n * @private\n */\nexport type URLClass = typeof URL;\n\nexport class WebUntisQR extends WebUntisSecretAuth {\n    /**\n     * Use the data you get from a WebUntis QR code\n     * @constructor\n     * @param {string} QRCodeURI A WebUntis uri. This is the data you get from the QR Code from the webuntis webapp under profile->Data access->Display\n     * @param {string} [identity=\"Awesome\"]  A identity like: MyAwesomeApp\n     * @param {Object} authenticator Custom otplib v12 instance. Default will use the default otplib configuration.\n     * @param {Object} URL Custom whatwg url implementation. Default will use the nodejs implementation.\n     * @param {boolean} [disableUserAgent=false] If this is true, axios will not send a custom User-Agent\n     */\n    constructor(\n        QRCodeURI: string,\n        identity: string,\n        authenticator: Authenticator,\n        URL?: URLClass,\n        disableUserAgent = false,\n    ) {\n        let URLImplementation = URL;\n        if (!URL) {\n            if ('import' in globalThis) {\n                throw new Error(\n                    'You need to provide the URL object by yourself. We can not eval the require in ESM mode.',\n                );\n            }\n            // React-Native will not eval this expression\n            URLImplementation = eval(\"require('url').URL\") as URLClass;\n        }\n        const uri = new URLImplementation!(QRCodeURI);\n        super(\n            uri.searchParams.get('school')!,\n            uri.searchParams.get('user')!,\n            uri.searchParams.get('key')!,\n            uri.searchParams.get('url')!,\n            identity,\n            authenticator,\n            disableUserAgent,\n        );\n    }\n}\n","import { InternalWebuntisSecretLogin } from './base';\n\nexport class WebUntisAnonymousAuth extends InternalWebuntisSecretLogin {\n    /**\n     *\n     * @param {string} school\n     * @param {string} baseurl\n     * @param {string} [identity='Awesome']\n     * @param {boolean} [disableUserAgent=false] If this is true, axios will not send a custom User-Agent\n     */\n    constructor(school: string, baseurl: string, identity = 'Awesome', disableUserAgent = false) {\n        // TODO: Make this a bit more beautiful and more type safe\n        super(school, null as unknown as string, null as unknown as string, baseurl, identity, disableUserAgent);\n        this.username = '#anonymous#';\n        this.anonymous = true;\n    }\n\n    override async login() {\n        // Check whether the school has public access or not\n        const url = `/WebUntis/jsonrpc_intern.do`;\n\n        const response = await this.axios({\n            method: 'POST',\n            url,\n            params: {\n                m: 'getAppSharedSecret',\n                school: this.school,\n                v: 'i3.5',\n            },\n            data: {\n                id: this.id,\n                method: 'getAppSharedSecret',\n                params: [\n                    {\n                        userName: '#anonymous#',\n                        password: '',\n                    },\n                ],\n                jsonrpc: '2.0',\n            },\n        });\n\n        if (response.data && response.data.error)\n            throw new Error('Failed to login. ' + (response.data.error.message || ''));\n\n        // OTP never changes when using anonymous login\n        const otp = 100170;\n        const time = new Date().getTime();\n        return await this._otpLogin(otp, this.username, time, true);\n    }\n}\n"],"names":["WebUntisDay","WebUntisElementType","fnsParse","__publicField"],"mappings":"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"}