{"version":3,"sources":["../src/helpers/HttpHelper.ts","../src/helpers/JsonHelper.ts","../src/helpers/StorageHelper.ts","../src/helpers/HashHelper.ts","../src/helpers/ZipHelper.ts","../src/interfaces/api/AuthData.ts","../src/interfaces/api/ProfileData.ts","../src/interfaces/api/ServersData.ts","../src/interfaces/api/UpdatesData.ts","../src/interfaces/api/VerifyData.ts","../src/interfaces/AuthType.ts","../src/interfaces/Profile.ts"],"sourcesContent":["import { mkdir, rename } from \"fs/promises\"\r\nimport { dirname } from \"path\"\r\nimport { URL } from \"url\"\r\n\r\nimport pMap from \"p-map\"\r\n\r\nimport { HashHelper, JsonData, JsonHelper, StorageHelper } from \".\"\r\nimport { createWriteStream } from \"fs\"\r\nimport { request } from \"undici\"\r\n\r\ninterface Progress {\r\n    url: string | URL\r\n    transferred: number\r\n    total: number\r\n}\r\ntype onProgressFunction = (progress: Progress) => void\r\n\r\nexport interface File {\r\n    sourceUrl: string\r\n    destinationPath: string\r\n    sha1?: string\r\n}\r\n\r\nexport class HttpHelper {\r\n    private static concurrency = 4\r\n\r\n    /**\r\n     * Изменить количество одновременно скачиваемых файлов\r\n     * @param concurrency\r\n     */\r\n    public static setConcurrency(concurrency: number) {\r\n        this.concurrency = concurrency\r\n    }\r\n\r\n    /**\r\n     * Проверка наличия ресурса\r\n     * @param url - строка или объект URL, содержащий ссылку на ресурс\r\n     * @returns Promise, который вернёт `true`, в случае существования ресурса или `false` при его отсутствии или ошибке\r\n     */\r\n    public static async existsResource(url: string | URL) {\r\n        try {\r\n            const { statusCode } = await request(url, { method: \"HEAD\" })\r\n            return statusCode >= 200 && statusCode < 300\r\n        } catch {\r\n            return false\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Чтение ресурса\r\n     * @param url - строка или объект URL, содержащий ссылку на ресурс\r\n     * @returns Promise, который вернёт содержимое ресурса, в случае успеха\r\n     */\r\n    public static async getResource(url: string | URL) {\r\n        const { body } = await request(url)\r\n        return body.text()\r\n    }\r\n\r\n    /**\r\n     * Чтение ресурса\r\n     * @param url - строка или объект URL, содержащий ссылку на ресурс\r\n     * @returns Promise, который вернёт содержимое ресурса, в случае успеха\r\n     */\r\n    public static async getHeaders(url: string | URL) {\r\n        const { headers } = await request(url)\r\n        return headers\r\n    }\r\n\r\n    /**\r\n     * Получение данных из JSON ресурса\r\n     * @param url - строка или объект URL, содержащий ссылку на ресурс\r\n     * @returns Promise, который вернёт обработанный объект, в случае успеха\r\n     */\r\n    public static async getResourceFromJson<T>(url: string | URL): Promise<T> {\r\n        return JsonHelper.fromJson<T>(await this.getResource(url))\r\n    }\r\n\r\n    /**\r\n     * Отправка POST запроса и получение результата из JSON\r\n     * @param url - строка или объект URL, содержащий ссылку на ресурс\r\n     * @returns Promise, который вернёт обработанный объект, в случае успеха\r\n     */\r\n    public static async postJson<T>(\r\n        url: string | URL,\r\n        json: JsonData,\r\n    ): Promise<T> {\r\n        const { body } = await request(url, {\r\n            method: \"POST\",\r\n            body: JsonHelper.toJson(json),\r\n            headers: { \"Content-Type\": \"application/json\" },\r\n        })\r\n        return (await body.json()) as T\r\n    }\r\n\r\n    /**\r\n     * Скачивание файла\r\n     * @param url - строка или объект URL, содержащий ссылку на файл\r\n     * @param filePath - путь до сохраняемого файла\r\n     * @param options - список опций:\r\n     * @param options.onProgress - коллбэк, в который передаётся текущий прогресс загрузки, если объявлен\r\n     * @param options.saveToTempFile - сохранять во временный файл, по умолчанию `false`\r\n     * @returns Promise который вернёт название файла в случае успеха\r\n     */\r\n    public static downloadFile(\r\n        url: string | URL,\r\n        filePath: string | null,\r\n        options: {\r\n            onProgress?: onProgressFunction\r\n            saveToTempFile?: boolean\r\n        } = {\r\n            saveToTempFile: false,\r\n        },\r\n    ) {\r\n        if (options.saveToTempFile) filePath = StorageHelper.getTmpPath()\r\n        if (filePath === null) throw new Error(\"File path not found\")\r\n\r\n        return this.download(url, filePath, options.onProgress)\r\n    }\r\n\r\n    /**\r\n     * Скачивание во временный файл с последующим переименованием в оригинал\r\n     * @param url - строка или объект URL, содержащий ссылку на файл\r\n     * @param filePath - путь до сохраняемого файла\r\n     * @param options - список опций:\r\n     * @param options.onProgress - коллбэк, в который передаётся текущий прогресс загрузки, если объявлен\r\n     */\r\n    public static async downloadSafeFile(\r\n        url: string | URL,\r\n        filePath: string,\r\n        options: {\r\n            onProgress?: onProgressFunction\r\n        } = {},\r\n    ) {\r\n        if (filePath === null) throw new Error(\"File path not found\")\r\n\r\n        await this.download(url, `${filePath}.safe`, options.onProgress)\r\n        return await rename(`${filePath}.safe`, filePath)\r\n    }\r\n\r\n    /**\r\n     * Скачивание файлов\r\n     * @param filesList - список файлов\r\n     * @param options - список опций:\r\n     * @param options.onProgress - коллбэк, в который передаётся текущий прогресс загрузки, если объявлен\r\n     * @param options.saveToTempFile - сохранять во временный файл, по умолчанию `false`\r\n     */\r\n    public static async downloadFiles(\r\n        filesList: File[],\r\n        options: {\r\n            onProgress?: onProgressFunction\r\n            beforeDownload?: (data: { url: string | URL }) => void\r\n            afterDownload?: (data: { url: string | URL }) => void\r\n        } = {},\r\n    ) {\r\n        await pMap(\r\n            filesList,\r\n            async (file) => {\r\n                if (await this.verifyFileHash(file)) {\r\n                    if (options.afterDownload)\r\n                        options.afterDownload({\r\n                            url: file.sourceUrl,\r\n                        })\r\n                    return\r\n                }\r\n\r\n                await this.download(\r\n                    file.sourceUrl,\r\n                    file.destinationPath,\r\n                    options.onProgress,\r\n                    options.beforeDownload,\r\n                    options.afterDownload,\r\n                )\r\n            },\r\n            { concurrency: this.concurrency },\r\n        )\r\n    }\r\n\r\n    /**\r\n     * Внутренняя функция скачивания файла\r\n     * @param url - строка или объект URL, содержащий ссылку на файл\r\n     * @param filePath - путь до сохраняемого файла\r\n     * @param onProgress - коллбэк, в который передаётся текущий прогресс загрузки, если объявлен\r\n     * @returns Promise, который вернёт название файла, в случае успеха\r\n     */\r\n    private static async download(\r\n        url: string | URL,\r\n        filePath: string,\r\n        onProgress?: onProgressFunction,\r\n        beforeDownload?: (data: { url: string | URL }) => void,\r\n        afterDownload?: (data: { url: string | URL }) => void,\r\n    ): Promise<string> {\r\n        await mkdir(dirname(filePath), { recursive: true })\r\n\r\n        const { statusCode, headers, body } = await request(url)\r\n\r\n        if (statusCode >= 400) {\r\n            throw new Error(\r\n                `Failed to download ${url} with status code ${statusCode}`,\r\n            )\r\n        }\r\n\r\n        const location = <string | undefined>headers[\"location\"]\r\n        // handle redirects\r\n        if (statusCode > 300 && statusCode < 400 && !!location) {\r\n            return this.download(\r\n                location,\r\n                filePath,\r\n                onProgress,\r\n                beforeDownload,\r\n                afterDownload,\r\n            )\r\n        }\r\n\r\n        if (onProgress) {\r\n            let transferred = 0\r\n            const total = +(headers[\"content-length\"] || 0)\r\n\r\n            body.on(\"data\", (chunk) => {\r\n                onProgress({\r\n                    url,\r\n                    transferred: (transferred += chunk.byteLength),\r\n                    total,\r\n                })\r\n            })\r\n        }\r\n\r\n        if (beforeDownload) {\r\n            beforeDownload({ url })\r\n        }\r\n\r\n        return new Promise((resolve, reject) => {\r\n            body.pipe(createWriteStream(filePath))\r\n                .on(\"finish\", () => {\r\n                    resolve(filePath)\r\n                    if (afterDownload) {\r\n                        afterDownload({ url })\r\n                    }\r\n                })\r\n                .on(\"error\", (error) => reject(error))\r\n        })\r\n    }\r\n\r\n    private static async verifyFileHash(file: File) {\r\n        if (!file.sha1) return false\r\n\r\n        try {\r\n            return await HashHelper.compareFileHash(\r\n                file.destinationPath,\r\n                \"sha1\",\r\n                file.sha1,\r\n            )\r\n        } catch {\r\n            return false\r\n        }\r\n    }\r\n}\r\n","export type JsonData = unknown\r\n\r\n/**\r\n * Класс хелпер для работы с JSON\r\n */\r\nexport class JsonHelper {\r\n    /**\r\n     * Преобразовать JSON строку в объект / массив\r\n     * @param string JSON строка\r\n     * @returns `Object | Array`\r\n     */\r\n    static fromJson<T>(string: string): T {\r\n        return JSON.parse(string)\r\n    }\r\n\r\n    /**\r\n     * Преобразовать объект / массив в JSON строку\r\n     * @param object Пробразуемый объект / массив\r\n     * @param pretty Форматировать вывод отступами или вывести в одну строку (по умолчанию `false`)\r\n     * @returns JSON сторка\r\n     */\r\n    static toJson(object: JsonData, pretty = false): string {\r\n        return pretty ? JSON.stringify(object, null, 4) : JSON.stringify(object)\r\n    }\r\n}\r\n","import { randomBytes } from \"crypto\"\r\nimport { tmpdir } from \"os\"\r\nimport { resolve } from \"path\"\r\n\r\nexport class StorageHelper {\r\n    /**\r\n     * Генерирует путь к времененной папке / файлу во временной деректории операционной системы\r\n     * @returns Путь к времененной папке / файлу\r\n     * @example `/tmp/962f2250ed89c7c013e4b442dcd620a5` или `C:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Temp\\\\d32e9f17ca638349326f9fa7228a7920`\r\n     */\r\n    static getTmpPath() {\r\n        return resolve(tmpdir(), randomBytes(16).toString(\"hex\"))\r\n    }\r\n}\r\n","import { BinaryLike, createHash } from \"crypto\"\r\nimport { readFile } from \"fs/promises\"\r\n\r\nexport class HashHelper {\r\n    /**\r\n     * Получить хеш данных\r\n     * @param data Данные\r\n     * @param type Тип хеша\r\n     * @returns Хеш данных\r\n     */\r\n    static getHash(data: BinaryLike, type: string) {\r\n        return createHash(type).update(data).digest(\"hex\")\r\n    }\r\n\r\n    /**\r\n     * Получить хеш файла\r\n     * @param path Путь до файла\r\n     * @param type Тип хеша\r\n     * @returns Хеш файла\r\n     */\r\n    static async getHashFromFile(path: string, type: string) {\r\n        return this.getHash(await readFile(path), type)\r\n    }\r\n\r\n    /**\r\n     * Сверить хеш файла с предоставленным хешем\r\n     * @param path Путь до файла\r\n     * @param type Тип хеша\r\n     * @param fileHash Хеш файла\r\n     * @returns `true` в случае совпадения, `false` в противном случае\r\n     */\r\n    static async compareFileHash(path: string, type: string, fileHash: string) {\r\n        return (await this.getHashFromFile(path, type)) === fileHash\r\n    }\r\n}\r\n","import { extname, join, dirname } from \"path\";\r\nimport { mkdir } from \"fs/promises\"\r\nimport StreamZip from \"node-stream-zip\";\r\nimport { HashHelper } from \"./HashHelper\";\r\n\r\nexport class ZipHelper {\r\n    /**\r\n    * Распаковка архива в папку\r\n    * @param archive - путь до архива\r\n    * @param destDir - конечная папка\r\n    * @param whitelist - распаковать файлы с определённым расширением (указывать с точкой, например: .so)\r\n    * @param onProgress - функция для отслеживания прогресса распаковки\r\n    * @returns список распакованных файлов\r\n    */\r\n    static async unzip(\r\n        archive: string,\r\n        destDir: string,\r\n        whitelist: string[] = [],\r\n        onProgress?: (size: number) => void\r\n    ): Promise<{ path: string; sha1: string }[]> {\r\n        // Открываем ZIP архив в асинхронном режиме\r\n        const zip = new StreamZip.async({ file: archive });\r\n        const extractedFiles: { path: string; sha1: string }[] = [];\r\n        \r\n        try {\r\n            // Получаем список всех записей в архиве\r\n            const entries = await zip.entries();\r\n            // Проходим по записям (ключами является имя файла в архиве)\r\n            for (const entry of Object.values(entries)) {\r\n                // Пропускаем директории\r\n                if (entry.isDirectory) continue;\r\n                // Если задан whitelist и расширение файла не включено в него, пропускаем\r\n                if (whitelist.length > 0 && !whitelist.includes(extname(entry.name))) {\r\n                    continue;\r\n                }\r\n                // Вызываем функцию обратного вызова для отслеживания прогресса\r\n                onProgress && onProgress(entry.compressedSize);\r\n                // Получаем данные записи\r\n                const data = await zip.entryData(entry);\r\n                const sha1 = HashHelper.getHash(data, \"sha1\");\r\n                extractedFiles.push({\r\n                    path: entry.name,\r\n                    sha1,\r\n                });\r\n                // Определяем полный путь для сохранения файла\r\n                const filePath = join(destDir, entry.name);\r\n                const fileDir = dirname(filePath);\r\n                \r\n                // Гарантируем, что каталог существует\r\n                await mkdir(fileDir, { recursive: true });\r\n                // Извлекаем файл \r\n                await zip.extract(entry, filePath);\r\n            }\r\n        } finally {\r\n            // Не забудьте закрыть архив для освобождения ресурсов\r\n            await zip.close();\r\n        }\r\n        return extractedFiles;\r\n    }\r\n}\r\n","import { AuthType } from \"../AuthType\"\n\nexport const GET_AUTH_TYPE_METHOD = \"getAuthType\"\nexport const AUTH_METHOD = \"auth\"\n\nexport interface AuthTypeResponseData {\n    type: AuthType\n    extra: unknown\n}\n\nexport interface AuthRequestData {\n    login: string\n    password: string\n}\n\nexport interface AuthResponseData {\n    username: string\n    userUUID: string\n    accessToken: string\n    refreshToken: string\n    isAlex?: boolean\n    skinUrl?: string\n    capeUrl?: string\n}\n","import { Profile } from \"../Profile\"\n\nexport const GET_PROFILE_METHOD = \"getProfile\"\n\nexport interface ProfileRequestData {\n    uuid: string\n}\n\nexport type ProfileResponseData = Profile\n","import { ProfileServerConfig } from \"..\"\n\nexport const GET_SERVERS_METHOD = \"getServers\"\n\nexport type Server = ProfileServerConfig & {\n    profileUUID: string\n}\n\nexport type ServersResponseData = Server[]\n","export const GET_UPDATES_METHOD = \"getUpdates\"\n\nexport interface UpdatesRequestData {\n    dir: string\n}\n\nexport interface HashedFile {\n    path: string\n    size: number\n    sha1: string\n}\n\nexport type UpdatesResponseData = HashedFile[]\n","export const VERIFY_METHOD = \"verify\"\n\nexport interface VerifyRequestData {\n    stage: number\n    token?: string\n}\n\nexport interface VerifyResponseData {\n    token?: string\n}\n","export enum AuthType {\n    INTERNAL = \"internal\",\n    YGGDRASIL = \"yggdrasil\",\n    MICROSOFT = \"microsoft\",\n    OFFLINE = \"offline\",\n}\n","export interface Profile {\r\n    //Don`t touch\r\n    configVersion: number\r\n\r\n    // Profile information\r\n    uuid: string\r\n    sortIndex: number\r\n    servers: ProfileServerConfig[]\r\n\r\n    // Client\r\n    javaVersion: number\r\n    version: string\r\n    clientDir: string\r\n    assetIndex: string\r\n    libraries: ProfileLibrary[]\r\n    gameJar: string\r\n    mainClass: string\r\n    jvmArgs: string[]\r\n    clientArgs: string[]\r\n\r\n    // Updates\r\n    update: string[]\r\n    updateVerify: string[]\r\n    updateExclusions: string[]\r\n    // TODO Продумать опционалки\r\n    // updateOptional: ProfileOptional[]\r\n\r\n    // Whitelist\r\n    whiteListType: \"null\" | \"uuids\" | \"permissions\"\r\n    whiteListPermisson?: number // TODO permission в виде чего?\r\n    whiteListUUIDs?: string[] // Список игроков по uuid\r\n}\r\n\r\nexport interface ProfileLibrary {\r\n    path: string\r\n    sha1: string\r\n    type: \"library\" | \"native\"\r\n    rules?: LibraryRule[]\r\n    ignoreClassPath?: boolean\r\n}\r\n\r\nexport interface LibraryRule {\r\n    action: Action\r\n    os?: OS\r\n}\r\n\r\nexport interface OS {\r\n    name: Name\r\n    arch?: string\r\n    version?: string\r\n}\r\n\r\nexport enum Action {\r\n    Allow = \"allow\",\r\n    Disallow = \"disallow\",\r\n}\r\n\r\nexport enum Name {\r\n    Linux = \"linux\",\r\n    Osx = \"osx\",\r\n    Windows = \"windows\",\r\n}\r\n\r\nexport interface ProfileServerConfigBase {\r\n    title: string\r\n}\r\nexport interface ProfileServerHostnameConfig extends ProfileServerConfigBase {\r\n    hostname: string\r\n}\r\n\r\nexport interface ProfileServerAddressConfig extends ProfileServerConfigBase {\r\n    ip: string\r\n    port: number\r\n}\r\n\r\nexport type ProfileServerConfig =\r\n    | ProfileServerHostnameConfig\r\n    | ProfileServerAddressConfig\r\n\r\n// export interface ProfileOptional {\r\n//     id: number\r\n//     name: string\r\n//     description: string\r\n//     mark: boolean\r\n//     filename: string\r\n//     conflict: number[]\r\n//     children: ProfileOptional[]\r\n// }\r\n"],"mappings":"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","names":["mkdir","rename","dirname","pMap","createWriteStream","request","HttpHelper","concurrency","url","statusCode","body","headers","JsonHelper","json","filePath","options","StorageHelper","rename","filesList","pMap","file","onProgress","beforeDownload","afterDownload","mkdir","dirname","location","transferred","total","chunk","resolve","reject","error","HashHelper","JsonHelper","string","object","pretty","randomBytes","tmpdir","resolve","StorageHelper","createHash","readFile","HashHelper","data","type","path","fileHash","extname","join","dirname","mkdir","StreamZip","ZipHelper","archive","destDir","whitelist","onProgress","zip","StreamZip","extractedFiles","entries","entry","extname","data","sha1","HashHelper","filePath","join","fileDir","dirname","mkdir","GET_AUTH_TYPE_METHOD","AUTH_METHOD","GET_PROFILE_METHOD","GET_SERVERS_METHOD","GET_UPDATES_METHOD","VERIFY_METHOD","AuthType","Action","Name"]}